Duangw

MQSeries Client编程

索引:

  1. 配置Client/Server之间的通讯连接
  2. 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建立连接的方法顺序:

  1. 使用MQCNO结构中的ClientConnOffset或ClientConnPtr域,只在MQCONNX有效;
  2. 若MQSERVER环境变量定义,则使用它定义的channel;
  3. 若MQCHLLIB和MQCHLTAB定义,则用它们来获得channel;
  4. client从mqs.ini中的DefaultPrefix或Windows NT的Registry搜寻channel定义表;
  5. 使用如下路径搜索:

    UNIX systems:/var/mqm/AMQCLCHL.TAB

    Windows NT, Windows 95, and Windows 98:bootdrive:\mqm \amqclchl.tab