MQ配置文档说明手册

来源:互联网 发布:软件需求十步走 编辑:程序博客网 时间:2024/05/16 09:29


第一章中间件消息通信技术概要
一、中间件
   
中间件,就是介于应用系统与系统软件之间的一类软件,它使用系统软件所提供的基础功能,衔接于应用系统的不同部分,能够达到资源共享和功能共享的目的。
   
消息中间件,是中间件众多产品分类中一个重要部分。它能够适用于任何需要进行网络通信的系统,负责建立网络通信的通道,进行数据或文件发送。消息中间件的一个重要作用是可以实现跨平台操作,为不同操作系统上的应用软件集成提供服务。

二、几种通信技术的比较
1
CPI-C
    CPI-C
是一种同步对话通信模式。参加通信的一方发起一次对话,同时控制信息流动。数据既可以由发送者传递到接受者,也可以反向流动。
   
参加通信的两个程序需要跟踪对话的状态,如果异常发生导致连接中断,则需要发送方重建并恢复这次通话。通信双方既可以处于主从地位,也可以处于对等地位。也就是说,CPI-C既支持客户端-服务器环境,也支持对等通信方式。
   
虽然CPI-C在一般情况下是一种同步通信类型,但是在一定环境中,如CICS,可以通过临时数据队列实现一定程度的异步。
    TCP/IP
SNA都支持CPI-C
   
由于需要应用程序参与错误的检测与恢复,CPI-C的编程接口相当复杂。
 

2
RPC
    RPC
,即远程过程调用,也是一种同步,对话方式的类型。一个调用程序向服务器提成申请,该调用被负责通信的转接器发往远端系统。调用者与被调用者关系是固定的,很难实现对等通信。
CPI-C一样,通信错误需要应用程序自己维护。另外在申请服务得到响应之前,服务申请者被阻隔,这不仅是应用的瓶颈所在,更有可能遭受拒绝式服务攻击。
 

3
MQI(MessageQueue Interface)
   
消息队列接口为程序提供了一种异步通信方式。一个程序以一个队列作为中转与另一个程序相互通信,这个队列向对于该程序而言既可以是本地,也可以是远程。当程序A与程序B进行通信时,A只需要将消息放入一条与B相通信的队列即可,至于消息何时,以何种协议,何种方式到达程序BA没有关系。底层的通信细节被接口所覆盖,甚至通信错误的恢复也由队列管理器代劳了,应用程序自身感受不到通信的发生。
   
由于通信方式和使用的协议无关,因而可以使用各种标准协议,比如TCP/IPSNA或者其他局域网协议。
   
当程序AB发送消息的时候,程序B不需要处于运行状态,消息队列负责了消息的转达。而且一个程序可以通过不同的队列与多个程序进行通信。
 

三、WebsphereMQ简介
    Websphere MQ
IBM公司的商业通信中间件。它提供一个具有工业标准,安全、可靠的消息传输系统,用以控制和管理一个集成的商业应用。Websphere MQ基本由一个消息传输体系和一套应用程序接口组成。

    Websphere MQ
主要包含以下资源:
1
   消息:
消息就是一个信元单位。消息类型包含请求消息(Request Message)、应答消息(ReplyMessage)、报告消息(ReportMessage)、报文消息(DatagramMessage)。另外,还有一类特殊的消息叫做触发消息,它是触发机制的重要组成部分。
消息包含两部分构成:消息描述符与应用程序数据。消息描述符标示消息,并包含其他控制信息,如消息类型和消息优先级;应用程序数据是消息的主体,它的内容与结构含义由使用它的程序定义。

2
   队列
队列是消息的存储场所。消息存放在队列中,应用程序可以相互独立的运行,以不同的速度、在不同的时间地点进行消息通信。
队列按照功能划分,主要包含十个大类:本地队列、远程队列、传输队列、动态与模板队列、启动队列、群集传输队列、死信队列、命令队列、回复队列与别名队列。

3
   消息传输系统
确保队列之间的消息传递。包括队列管理与调度、消息传达,并保证网络故障后的恢复。传输系统由队列、队列管理器、通道、进程、群集以及其他部分组成。
队列管理器是队列和其他对对象的容器。Websphere MQ的每一个部分都属于一个队列管理器,它是一个基本独立的执行单元,应用程序通过MQI编程接口向队列管理器申请服务。
通道,是一种提供从一个队列管理器到另外一个队列管理器的通信途径。它通过消息通道代理(Message Channel Agents)把两个队列管理器连接起来。消息通道可以分为6种类型:发送通道(Sender)、接受通道(Receiver)、服务器通道(Server)、请求器通道(Requester)、群集发送通道(ClusterSender)和群集接受通道(ClusterReceiver)
除了消息通道,还有一种特殊的通道,称为MQI通道。MQI通道是Websphere MQ客户端和服务器上的队列管理器的通信通道,当客户应用程序发出MQCONNMQCONNX调用时,才开始建立连接。
消息通道与MQI通道主要存在两点差别。首先,MQI是双向通道,既可以发送请求,也可以接受响应,而消息通道只能进行单向数据通信;另外,MQI通道的通信是同步的,当MQI请求从客户端发送到服务器时,Websphere MQ的客户端在发送下一个请求必须等待来自服务器的响应。而消息通道的数据传输的异步的,与时间无关。

4
   应用程序接口
消息系统与应用程序之间通过一系列Websphere MQ API来实现。API只有14个调用,2个关键字:PUTGET

第二章IBM MQSeries的触发机制
一、触发器原理
   
触发(Triggering),是一种自动启动应用程序的机制。
队列管理器把某种条件称为触发事件。如果队列被设置为触发类型,并且触发事件发生了,那么队列管理器将发送一个触发消息到一个称作启动队列的队列中。触发消息被放置到启动队列的过程意味着产生了触发事件。

   
处理队列管理器中的消息是触发监控程序(Trigger-Monitor Application),他的工作是读取触发消息并根据触发消息的信息做出相应的处理。触发监控程序没有什么特殊,它只不过是启动队列读取消息的应用程序。

当队列管理器发现由一条消息到达被触发的队列之后,它产生的触发消息将被存放到启动队列中,触发监控程序将从启动队列中取出触发消息,并根据触发消息中的内容,启动相应的消息处理程序来处理被触发队列中的消息。
   
   
触发所涉及的对象如下:
    1
应用队列:一个本地队列并设置为可触发。当触发条件满足时,将会产生触发消息。
    2
进程定义:一个应用队列可能由一个进程定义对象和它关联。进程定义中包含应用程序的信息。该应用程序负责从应用队列中取出消息。
    3
传输队列:如果用触发方式来启动通道,则需要一个传输队列。在传输队列的TriggerData属性中设置为将被启动的通道名,这将省略进程的定义。
    4
触发事件:它是一种引起队列管理器产生触发消息的事件。
    5
触发消息:当触发事件发生时,队列管理器将产生触发消息。触发信息来自于应用队列和于应用队列关联的进程定义,它包含了将要被启动的程序名。
    6
启动队列:一个本地队列。被用来存发触发消息的队列。一个队列管理器可用拥有多个启动队列。一个启动队列可以为多个应用队列服务。
    7
触发监控器:是一个持续运行的程序,当一个触发消息到达启动队列时,触发监控器获取触发消息,并利用触发消息中的信息,启动应用程序来处理应用队列中的消息,并把触发消息头发送传递给应用程序,消息头中包含应用队列名。
   
   
在所有平台上,都有一个特殊的触发监控器叫做通道启动器(Channel Initator),它的作用就是启动通道。

二、触发类型
1
EVERY
   
应用队列中每接受到一个消息时,都将产生触发消息。如果应用程序仅仅处理一个消息就结束,可采用这种触发类型。

2
FIRST
   
应用队列中消息从0变为1时会触发事件。如果当队列中的一个消息到达时启动程序,直到处理完所有消息才结束,则采用这种触发类型。

3
DEPTH
   
应用队列中消息数目和TriggerDepth(引起触发事件发生时,队列中的消息数目)属性值相同时,才会产生触发事件。当一系列请求的回复都收到时,才启动应用程序,则可以采用这种方法。
   
需要注意的时,当DEPTH属性值为0的时候,实际上就形成了同步通信。另外,当采用Depth触发时,产生触发消息以后,队列将被修改为非触发方式,如果需要再次触发,需要重新设置成允许触发。

   
一般而言,在实际应用中,如果通道设置成触发方式,触发类型往往设置成为FIRSTDEPTH


三、触发器工作流程

1
   本地或远程应用程序A,往应用队列(Application Queue)PUT了一条消息。
2
   当队列原来深度为0时(队列为空),这是PUT一条消息到队列中将形成触发事件,同时产生一条触发消息,触发消息中将包含进程定义中的信息。
3
   队列管理器创建触发消息,并把它PUT入与应用队列相关的启动队列Initiation Queue
4
   触发监控器(TriggerMonitor)从启动队列(InitiationQueue)GET触发消息。
5
   触发监控器处理触发消息,发出启动应用程序B的命令。
6
   应用程序B打开应用队列(ApplicationQueue),并处理队列中的消息。

第三章MQ配置说明文档
安装系统后,以administrator进入;
安装完,自动生成mqm组;
administrtor加入mqm组,或定义mqm用户,将mqm用户加入mqmadmin组;
重启,以administrator(mqm)进入;

需要更改系统配置文件,使得1414端口被监听(不过启动通道之前仍需启动监听器)
进入系统目录/winnt/system32/drivers/etc/services,
加入MQSeries   1414/tcp     #MQSeries channel listener

如果实在AIX环境下,则添加字符串改为
MQSeries stream tcp nowait root /usr/lpp/mqm/bin/amqcrsta amqcrsta –m AIX
********root
mq用户名,AIXmq管理器******
改好后,refresh–s inetd

最后,管理器的CCSID要一样,DIS QMGR***查看***
ALTER QMGR CCSID(437) ***437
为西文字符集***

下面的步骤需要在DOS环境下进入MQ的安装目录/bin

示例一(本机SDR通道,接受端RCVR通道)
在发送方A (本机:127.0.0.1)
1
建立队列管理器QMA: crtmqm QMA
2
strmqm QMA
    runmqsc QMA
3
定义本地传输队列: define qlocal (QAQB) usage (xmitq) defpsist(yes)REPLACE
4
创建远程定义: define qremote (QR.TOB) rname (LQB) rqmname (QMB) xmitq(QAQB) REPLACE
//
远程定义(本地队列管理器):QR.TOB
//
远程队列名称:LQB
//
远程队列管理器名称:QMB
//
传输队列名称:QAQB
5)
定义死信队列
   ALTER QMGR DEADQ(QMA.DEADQ)
   DEFINE QL(QMA.DEADQ) REPLACE
6
定义发送通道: define channel (A.TO.B) chltype (SDR) conname('192.168.0.198(1414)') xmitq (QAQB) trptype (tcp)
// define channel (A.TO.B) chltype (SDR) conname ('127.0.0.1(1414)') xmitq(QAQB) trptype (tcp) REPLACE
7
end   //退出MQSC命令环境
8
runmqlsr–t TCP –M QMA  //启动监听器
9
runmqchl–c A.TO.B –m QMA
//
注意:启动此步之前,需要保证QMB上的通道定义完成并且侦听器在QMB上已经启动

在接收方B(假设为:192.168.0.198:1414 / 127.0.0.1:1414)
1
建立队列管理器QMB: crtmqm QMB
2
strmqm QMB
3
RUNMQSC QMB
4)
定义死信队列
   ALTER QMGR DEADQ(QMB.DEADQ)
   DEFINE QL(QMB.DEADQ) REPLACE
5
定义本地队列LQB: define qlocal (LQB) DEFPSIST(YES) REPLACE
6
创建接收通道: define channel (A.TO.B) chltype (RCVR) trptype (tcp)REPLACE
7
end   //退出MQSC命令环境
——————
测试验证——————
  AMQSPUT QR.TOB QMA
//
QMA队列管理器的QR.TOB远程定义中输入一些消息数据
 AMQSGET LQB QMB
 //
QMB队列管理器的LQB本地消息队列中读取通过管道A.TO.B传递过来的数据



关于通道:
通道是MQ的关键,主要包括手动方式启动和自动方式(触发)启动。

手动方式:手动方式维护有两个通道参数值得注意:
1
DISCINTDisconnectInterval断开间隔)
当传输队列中没有消息要传送时,发送方通道(SDR)、服务器通道(SVR)将在等待了该参数指定的时间间隔后断开连接,停止通道。该参数以秒为单位,定义新的通道时,如果没有特别指定,该参数会继承系统对象的属性,设为6000秒,约两个小时。亦通道连续两个小时没有消息发送后就会停止。DISCINT参数设定为0,通道永远不会停止。

2
HBINT(HeartBeat Interval,心跳间隔)
当传输队列中没有消息要传送时,发送方通道(SDR)、服务器通道(SVR)定时向对方发送心跳测试信号,双方通道借这个信号作消息发送事务的同步(quiesce)。通常这个参数的值要比DISCINT参数的值小很多,让通道程序有机会在停止之前作多次的事务同步较验。
假如系统管理员为了避免反复重新启动通道而把DISCINT参数设定为0,但通道运行期间网络线路发生了故障,通讯双方不能交换心跳信号,通道也会停止,仍然要求系统管理员监控网络线路状态和通道状态,在网络线路收复后重新启动。也可以编写专门的监控程序自动执行这些工作,但都比较复杂。

系统管理员不能因为交换心跳信号失败会导致通道停止就把HBINT设为0或设为极大的值,当有消息要通过通道发送出去,但网络线路又发生故障时,发送通道会停止,但接收通道不会停止。所以下次系统管理员再启动通道时会发现MQ报告出错信息远程节点不可用或资源不足,这不是因为远程节点的连接有问题,或内存资源不足,而是因为远程节点上的接收通道没有停止,启动发送通道时发现对方节点上同名的通道还在运行,就禁止本地的发送通道启动。系统管理员只好在远程节点上停止接收通道(STOP CHANNEL 命令)
 
正常情况下并不推荐使用STOP CHANNEL命令,该命令把通道置于STOPPED状态,实际上是不可用状态。为了重新使用该通道,系统管理员要输入START CHANNEL 命令,但这条命令并没有真正地启动通道,要在发送方输入START CHANNEL命令才能启动通道。必须注意的是,STOP CHANNEL命令与START CHANNEL命令对接收通道都是没有实际意义的,只是修改了通道的状态。


常用命令
创建队列管理器
crtmqm –q QMgrName
-q
是指创建缺省的队列管理器
删除队列管理器
dltmqm QmgrName
启动队列管理器
strmqm QmgrName
如果是启动默认的队列管理器,可以不带其名字
停止队列管理器
endmqm QmgrName
受控停止
endmqm –i QmgrName
立即停止
endmqm –p QmgrName
强制停止
显示队列管理器
dspmq –m QmgrName
运行MQSeries命令
runmqsc QmgrName
如果是默认队列管理器,可以不带其名字

往队列中放消息
amqsput QName QmgrName
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
从队列中取出消息
amqsget QName QmgrName
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
启动通道
runmqchl –c ChlName –m QmgrName

启动侦听
runmqlsr –t TYPE –p PORT –m QmgrName

停止侦听
endmqlsr -m QmgrName

MQSeries
命令
定义死信队列
DEFINE QLOCAL
QNAME DEFPSISTYES REPLACE
设定队列管理器的死信队列
ALTER QMGR DEADQ
QNAME
定义本地队列
DEFINE QL
QNAME REPLACE
定义别名队列
DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)
远程队列定义
DEFINE QREMOTE
QRNAME +
RNAME
AAA RQMNAMEQMGRNAME +
XMITQ
QTNAME
定义模型队列
DEFINE QMODEL
QNAME DEFTYPETEMPDYN
定义本地传输队列
DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +
INITQ
SYSTEM.CHANNEL.INITQ+
PROCESS(PROCESSNAME) REPLACE

创建进程定义
DEFINE PROCESS
PRONAME +
DESCR
‘STRING’+
APPLTYPE
WINDOWSNT+
APPLICID
’runmqchl -c SDR_TEST -m QM_ TEST’
其中APPLTYPE的值可以是:CICSUNIXWINDOWSWINDOWSNT

创建发送方通道
DEFINE CHANNEL
SDRNAME CHLTYPESDR+
CONNAME
‘100.100.100.215(1418)’ XMITQQTNAME REPLACE
其中CHLTYPE可以是:SDRSVRRCVRRQSTRCLNTCONNSVRCONNCLUSSDRCLUSRCVR

创建接收方通道
DEFINE CHANNEL
SDR_ TEST CHLTYPERCVR REPLACE

创建服务器连接通道
DEFINE CHANNEL
SVRCONNNAME CHLTYPESVRCONN REPLACE

显示队列的所有属性
DISPLAY QUEUE
QNAME [ALL]

显示队列的所选属性
DISPLAY QUEUE
QNAME DESCR GET PUT
DISPLAY QUEUE
QNAMEMAXDEPTH CURDEPTH

显示队列管理器的所有属性
DISPLAY QMGR [ALL]

显示进程定义
DISPLAY PROCESS
PRONAME

更改属性
ALTER QMGR DESCR
‘NEW DESCRIPTION’
ALTER QLOCAL
QNAME PUTDISABLED
ALTER QALIAS
QNAME TARGQTARGQNAME

删除队列
DELETE QLOCAL
QNAME
DELETE QREMOTE
QRNAME

清除队列中的所有消息
CLEAR QLOCAL
QNAME

常用补充命令
显示队列管理器dspmq
显示文件名dspmqfls

启动本地队列管理器 strmqm
结束本地队列管理器 endmqm
启动通道启动进程 runmqchi/runmqchl

 


原创粉丝点击