MQSeries Client编程
索引:
1.配置Client/Server之间的通讯连接
(1).communication links
MQSeries中的逻辑通讯连接叫做channels,MQI channels。
(2).通讯协议
以最常用的TCP为例。
在每种平台下,TCP每个端口的连接数都是有限的,当连接数超过此限制时,client调用MQCONN会返回错误码MQRC_Q_MGR_NOT_AVAILABLE。解决此方法是为一个队列管理器定义多个端口。
可以打开TCP中的KeepAlive选项,来检测一段时间后连接是否存在,不在则关闭channels,方法是编辑配置文件qm.ini,增加如下内容:
TCP: KeepAlive=yes
文件路径:
WINDOWS:<drive>:\<dir>\mqm
UNIX:/var/mqm
(3).定义与Windows NT server的连接
配置端口:
在文件<drive>:\winnt\system32\drivers\etc\services,增加:
MQSeries 1414/tcp
缺省为1414,可以不定义,也可改为其他值;
若有多个queue manager,则定义多条:
MQSeries1 1414/tcp MQSeries2 1415/tcp
启动监听器:
RUNMQLSR -t tcp [-m QMNAME ] [-p 1822]
其中,-m:指定队列管理器,对于缺省队列管理器不用指定该参数;
-p:指定监听端口,若使用缺省值1414不用指定该参数。
若有多个队列管理器,则启动多个监听器,如:
RUNMQLSR -t tcp RUNMQLSR -t tcp -m QM2 -p 1415
(4).定义与UNIX system server的连接
配置端口:
在文件/etc/services中增加:
MQSeries 1414/tcp(缺省为1414,可改为其他值)
配置inetd:
编辑inetd.conf文件,增加:
MQSeries stream tcp nowait mqm /mqmtop \ /bin/amqcrsta amqcrsta [-m QM1 ]
其中,-m指定队列管理器名,缺省管理器可以不指定。
使配置生效:
AIX:refresh -s inetd
Other UNIX:kill -1 <process number of inetd daemon>
对于多个管理器,则定义多条:
etc/services:
MQSeries1 1414/tcp MQSeries2 1415/tcp
inetd.conf:
MQSeries1 stream tcp nowait mqm /mqmtop \ /bin/amqcrsta amqcrsta -m QM1 MQSeries2 stream tcp nowait mqm /mqmtop \ /bin/amqcrsta amqcrsta -m QM2
若平台支持RUNMQLSR,也可使用它,方法同WINDOWS,如:
RUNMQLSR -t tcp [-m QMNAME ][-p 1822 ]
(5).定义MQI channels
Client与Server之间通过MQI channle通讯。
(6).Client与Server都定义的方式
Server端定义(使用MQSC):
DEFINE CHANNEL(CHAN1) + CHLTYPE(SVRCONN) TRPTYPE(TCP)+ DESCR('Server-connection to Client_1');
Client端定义(有两种方法):
法一、定义MQSERVER环境变量:
SET MQSERVER=CHAN1/TCP/MCID66499 export MQSERVER=CHAN1/TCP/'MCID66499'
法二、使用MQCNO结构,在MQCONNX调用中:
可以在运行时才决定连接的Server。
(7).都在Server端定义的方式
Server端:
定义server-connection channel:
DEFINE CHANNEL(CHAN2) + CHLTYPE(SVRCONN) TRPTYPE(TCP)+ DESCR('Server-connection to Client_2');
定义client-connection channel:
DEFINE CHANNEL(CHAN2) + CHLTYPE(CLNTCONN) TRPTYPE(TCP)+ CONNAME(9.20.4.26) QMNAME(QM2)+ DESCR('Client-conn to Server_2');
两者名称相同:CHAN2,CONNAME为网络地址,QMNAME为队列管理器名。
Client端:
设置环境变量MQCHLLIB和MQCHLTAB:
export MQCHLLIB=/var/mqm/qmgrs/QUEUEMANAGERNAME/@ipcc export MQCHLTAB=AMQCLCHL.TAB
WINDOWS下的路径为:
\mqm \qmgrs \queuemanagername \@ipcc
2.Client应用开发
(1).概念
注意在MQSeries Client环境下与在完全MQSeries queue manager环境下的区别。
消息大小的限制;
Client与Server端的字符集;
在MQSeries Client环境下,每个应用都有它的到server的连接,连接在调用MQCONN或MQCONNX时建立;应用同步的发送消息/接收消息;数据转换在server端完成。
(2).Client库(C代码)
AIX:
非线程应用:libmqic.a;
线程应用:libmqic_r.a
AT&T GIS UNIX:
libmqic.so and libmqmcs.so
$/bin/cc -o <prog> <prog>.c -lmqic -lmqmcs -lmqmzse -lnet -lnsl -lsocket -ldl -lc
HP-UX:
libmqic.sl
Sun Solaris:
libmqic.so and libmqmcs.so
$/opt/SUNWspro/bin/cc -o <prog> <prog>.c -mt -lmqic -lmqmcs -lsocket -lc -lnsl -ldl
Sun Solaris, Intel Platform Edition:
$/opt/SUNWspro/bin/cc -o <prog> <prog>.c -mt -lmqic -lmqmcs -lmqmzse -lsocket -lc -lnsl -ldl
Windows NT:
MQIC32.LIB
Windows 95 and Windows 98:
MQIC32.LIB
(3).连接顺序
在MQSeries Client环境下Client与server建立连接的方法顺序:
- 使用MQCNO结构中的ClientConnOffset或ClientConnPtr域,只在MQCONNX有效;
- 若MQSERVER环境变量定义,则使用它定义的channel;
- 若MQCHLLIB和MQCHLTAB定义,则用它们来获得channel;
- client从mqs.ini中的DefaultPrefix或Windows NT的Registry搜寻channel定义表;
使用如下路径搜索:
UNIX systems:/var/mqm/AMQCLCHL.TAB
Windows NT, Windows 95, and Windows 98:bootdrive:\mqm \amqclchl.tab