websphere mq应用程序通信

来源:互联网 发布:mac系统基础教程视频 编辑:程序博客网 时间:2024/06/07 21:48

实现应用程序通信

      

发送消息到远程队列管理器

这部分描述了把消息从一个队列管理器发送到另一个队列管理器的最简单的方法,发送消息前需要做如下的准备工作:

 

1. 检查通讯链路,确保可用。

2. 启动队列管理器。

3. 启动通道启动器。

4. 启动侦听程序。

 

您也需要有合适的WebSphere MQ权限来创建对象。

在源队列管理器上需要定义如下对象:

– 发送通道

– 远程队列定义

– 启动队列 (在z/OS平台上是必须的,其它平台是可选的。)

– 传输队列

– 死信队列 (推荐)

在目标队列管理器上需要定义如下对象:

– 接收通道

– 目标队列

– 死信队列(推荐)

针对不同的平台,您可以使用不同的方法来定义对象:

例如,在OS/2, Windowssystems, UNIX systems, and Compaq OpenVMS Alpha 平台,您可以使用《WebSphere MQ Script (MQSC) Command Reference》书中的WebSphere MQ 命令或《WebSphere MQProgrammable Command Formats and dministration Interface》书中PCF 命令。仅在Windows系统中,您可以使用图形界面,WebSphere MQexplorer和WebSphere MQ Web Administration。

 

定义通道

为了把消息从一个队列管理器发送到另一个队列管理器,您需要定义两个通道;一个是在源队列管理器,另一个是在目标队列管理器

在源队列管理器

定义一个通道类型为SENDER的通道,您需要说明如下属性

1,使用的传输队列名( XMITQ属性)。

2,目标系统的连接名(CONNAME属性)。

3,正使用的通讯协议 ( TRPTYPE属性)。在 AIX, iSeries, Compaq Tru64 UNIX, HP-UX, OS/2 Warp, Solaris, 和 Windows, 可以不设置这个属性,而使用通道的缺省值。

 

在目标队列管理器

定义一个通道类型为RECEIVER的通道,并且和发送通道同名。设置正使用的通讯协议(TRPTYPE属性)。在 AIX, iSeries, Compaq Tru64 UNIX, HP-UX, OS/2Warp, Solaris, 和 Windows, 可以不设置这个属性,而使用通道的缺省值。

接收通道的定义都普遍相同,如果您有几个队列管理器同时往同一个队列管理器发送消息,那么发送通道和接收通道都是相同的名字,这样在接收方只要定义一个接收通道就可以负责接收所有的消息。

当已经定义了通道,您可以使用“PING CHANNEL”来测试通道。这个命令从发送通道发送了一个特殊的消息到接收通道,并且检测它的返回情况

 

定义队列

为把消息从一个队列管理器发送到另一个队列管理器,您需要定义六个队列;在源队列管理器需要定义四个,目标队列管理器要定义两个。

 

在源队列管理器

1,远程队列定义

在这个定义中需要说明下列属性:

远程队列管理器名

       目标队列管理器名

远程队列名

在目标队列管理器上的目标队列名。

传输队列名

传输队列的名称,您可以不说明它。如果没有说明这个属性,将会使用一个和目标队列管理器同名的传输队列,或者这个传输队列不存在,将会使用缺省传输队列。建议传输队列名和目标队列管理器同名,以便这个队列在缺省情况下能找到它。

2,启动队列定义

在z/OS平台上,这是必须定义的;其他平台上使可选的。在z/OS平台上您必须定义队列名为“SYSTEM.CHANNEL.INITQ”的启动队列,在其它平台您也可以使用它。

3,传输队列定义

一个本地队列的“USAGE”属性被设置成“XMITQ”。如果您使用了 WebSphere MQfor iSeries ,那么“USAGE”属性是“*TMQ”。

4,死信队列定义—推荐

定义一个死信队列是为了存放不能交付的消息。

在目标队列管理器

1,本地队列定义

目标队列。这个队列名必须和在源队列管理器中的远程队列定义中远程队列名的属性值相同。

2,死信队列—推荐

定义一个死信队列是为了存放不能交付的消息。

发送消息

当您把消息放在源队列管理器的远程队列定义中时,这消息将被存放在传输队列中,直到通道被启动。当通道被启动,消息被交付到远程队列管理器的目标队列中。

启动通道

在发送队列管理器上使用“START CHANNEL”命令启动通道。当您启动发送通道时,接收通道将被自动地启动(由侦听程序启动),消息然后被发送到目标队列。消息通道的两端都必须处在“running”状态,消息才能被发送。由于通道的两端是处在不同的队列管理器中,它们使用了不同的属性。

发送消息之前,发送MCA把大消息分割成小消息,然后通过通道发送出去,在目标队列管理器再把这些小消息组装成大消息,这些步骤对用户来说是透明的。一个MCA在传输消息时可以启动多个线程,这种叫“pipelining”的过程能更有效地提高消息传输的效率,从而提高通道的性能。

触发通道

下面主要介绍触发的概念,您可以在《WebSphere MQ Application ProgrammingGuide》文档中找到关于触发机制更详细的描述。


 

上图描述了触发所需的对象和事件发生的顺序:

1. 本地队列管理器从应用程序或MCA放一个消息到传输队列。

2. 当触发条件满足时,本地队列管理器产生一条触发消息并放到启动队列。

3. 长期运行的通道启动器监控着启动队列,并检索队列中的触发消息。

4. 通道启动器按照消息中的内容处理触发消息。触发消息中可能包括需要被启动的通道名。

5. 被触发的本地应用程序或MCA将从传输队列中检索消息。

 

为了配置触发环境,您需要做如下准备工作:

1,创建传输队列,设置启动队列属性为“SYSTEM.CHANNEL.INITQ”。

2,确保启动队列“SYSTEM.CHANNEL.INITQ”存在。

3,确保通道启动程序是可用的并在运行。启动通道启动器时需要提供启动队列名。

4,创建进程定义,如果没有创建,那么确保进程定义的“UserData”属性值包含了通道名,对于 WebSphere MQ for AIX, iSeries, HP-UX, Linux, Solaris 和 Windows systems, 和WebSphere MQfor Compaq Tru64 UNIX, 和 OS/2 Warp平台, 可以不创建进程定义,如果不创建进程定义,您可以在传输队列的“TriggerData”属性中设置为通道名。

5,如果使用了进程定义,请确保传输队列定义中包含了进程定义名,和启动队列名,并设置合适的触发条件。

 

注意:

1. 通道启动器程序充当了“触发监控器”,监控着启动队列,用来启动通道。

3. 可以定义多个启动队列和触发进程。

4. 推荐的触发类型为“FIRST”。

 

消息的安全性

分布式队列管理通过通道两端的同步点协调来确保消息被正确地传输。如果协调过程发现了错误,将关闭通道,把消息安全地存放在传输队列中,直到通道被重新启动。当通道启动时,同步过程可以恢复可疑(in-doubt)状态。处理通道的可疑状态可疑用下列方法:

1. 用提交或回滚的方法Resolve通道。

2. 复位通道的消息序号。

 

只有意外的情况,才会出现通道可疑的情况,一般情况通道能自动解决可疑状态。

 

快速, 非永久消息

在 WebSphere MQ for AIX, iSeries, HP-UX,Linux, Solaris, Windows systems, 和 OS/2 Warp平台,通道的NPMSPEED (nonpersistent message speed) 属性可以用来说明任何非永久性消息将更快地传输。当快速、非永久消息在传输中,通道出现了中断,消息可能被丢失。如果接收通道不能把消息放到目的队列时,则将被放到死信队列中;如果死信队列没有定义,那么消息将被丢弃。

WebSphere MQ对象配置实例

*echo "   修改队列管理器的死信队列为DEADQ"

ALTER  QMGR +

       DEADQ('DEADQ') +

       TRIGINT(10000)

      

*echo "   定义远程队列"

DEFINE QREMOTE ('0000_1') +

       DEFPSIST(YES) +

       XMITQ('QM0000') +

       RNAME('0000_1') +

       RQMNAME('QM0000') +

       REPLACE

 

DEFINE QREMOTE ('0000_2') +

       DEFPSIST(YES) +

       XMITQ('QM0000') +

       RNAME('0000_2') +

       RQMNAME('QM0000') +

       REPLACE

 

*echo "   定义死信队列"

DEFINE QLOCAL ('DEADQ') +

       DEFPSIST(YES) +

       MAXDEPTH(20000) +

       MAXMSGL(4194304) +

       REPLACE

      

*echo "   定义错误日志队列"

DEFINE QLOCAL ('ERRMSG') +

       DEFPSIST(YES) +

       MAXDEPTH(10000) +

       MAXMSGL(1048576) +

       REPLACE

 

*echo "   定义本地接收队列"

DEFINE QLOCAL ('nnnn_1') +

       DEFPSIST(YES) +

       MAXDEPTH(100000) +

       MAXMSGL(1048576) +

       TRIGGER +

       TRIGTYPE(FIRST) +

       PROCESS('CICS.PRO') +

       INITQ('SYSTEM.CICS.INITIATION.QUEUE') +

       REPLACE

      

*echo "   定义传输队列"

DEFINE QLOCAL ('QM0000') +

       DEFPSIST(YES) +

       MAXDEPTH(100000) +

       MAXMSGL(1048576) +

       USAGE(XMITQ) +

       TRIGGER +

       TRIGTYPE(FIRST) +

       TRIGDATA('nnnn.0000') +

       INITQ('SYSTEM.CHANNEL.INITQ') +

       REPLACE

 

*echo "   修改system.cics.initiation.queue队列的属性"

ALTER QLOCAL ('SYSTEM.CICS.INITIATION.QUEUE') +

       DESCR('WebSphere MQ Default CICS Initiation queue') +

       DEFPSIST(YES) +

       MAXDEPTH(100000) +

       MAXMSGL(1000)

      

      

*echo "   定义接收通道"

DEFINE CHANNEL ('0000.nnnn') CHLTYPE(RCVR) +

       TRPTYPE(TCP) +

       BATCHSZ(50) +

       HBINT(300) +

       MRRTY(10) +

       MRTMR(1000) +

       REPLACE

 

*echo "   定义发送通道"

DEFINE CHANNEL ('nnnn.0000') CHLTYPE(SDR) +

       TRPTYPE(TCP) +

       BATCHSZ(50) +

       CONNAME('NPC') +

       DISCINT(1800) +

       HBINT(300) +

       LONGRTY(999999999) +

       LONGTMR(300) +

       SHORTRTY(10000) +

       SHORTTMR(30) +

       XMITQ('QM0000') +

       REPLACE

 

DEFINE CHANNEL ('SYSTEM.ADMIN.SVRCONN') CHLTYPE(SVRCONN) +

       TRPTYPE(TCP) +

       HBINT(300) +

       MAXMSGL(4194304) +

       MCAUSER('mqm') +

       REPLACE

 

*echo "   定义接收进程"

DEFINE PROCESS ('CICS.PRO') REPLACE +

       APPLTYPE(CICS) +

       APPLICID('MCTL')

      

 

0 0
原创粉丝点击