文档库 最新最全的文档下载
当前位置:文档库 › MQ配置案列

MQ配置案列

MQ配置案列
MQ配置案列

本地和远程队列的单个队列管理器实现过程

1、基础环境

2、安装MQ

在第一章中我们已经学会了如何安装MQ了,在这里就不在详细阐述具体步骤了,我们需要是把两台服务器都安装MQ。

安装 WebSphere MQ 前,必须执行 ./mqlicense.sh,以阅读和接受许可证。

安装所需的 MQ 包及 WebSphere MQ Java 和 IBM Java SDK 包,以便为WebSphere MQ 开发 Java 客户机:

[mqm@product240 install] # rpm -ivh IBMJava2-SDK-1.4.2-0.0.i386.rpm [mqm@product240 install] # rpm -ivh MQSeriesRuntime-6.0.0-0.i386.rpm

[mqm@product240 install] # rpm -ivh MQSeriesServer-6.0.0-0.i386.rpm [mqm@product240 install] # rpm -ivh MQSeriesJava-6.0.0-0.i386.rpm

WebSphere MQ 现在已经完成安装,并有用于进行配置的名为 mqm 的用户和组。缺省情况下,WebSphere MQ 安装在 /opt/mqm 中,队列和其他配置信息位于用户 mqm 的主目录中。Java SDK 安装在 /opt/IBMJava2-142 中,Java 解释程序位于 /opt/IBMJava2-142/bin 中。

3、MQ TCP连接配置命令

在配置之前有必要先了解一下WebSphere MQ 术语和定义

1)WebSphere MQ 术语和定义

队列管理器---提供队列服务和 API 及用于管理队列的管理功能的系统管

理程序。

队列---消息所发送到的命名目的地。

本地队列---位于队列管理器本地的队列。

远程队列---驻留在其他队列管理器(可能位于其他主机上)的队列。

传输队列---以远程队列为目标的临时消息队列。

通道---队列管理器之间的通信路径。

侦听器---从客户机或其他队列管理器接受网络请求。

命令服务器---验证命令并将有效命令发送到命令处理器(后者随后执行命

令)。

2)MQ TCP连接配置命令

在product240机器上执行如下操作

创建队列管理器

[mqm@product240 ~] # crtmqm QM_LINUX240

启动队列管理器

[mqm@product240 ~] # strmqm QM_LINUX240

使用MQ控制台命令RUNMQSC配置

runmqsc QM_LINUX240

●创建死信队列:

DEFINE QL(RE240.DEADQ) DEFPSIST(YES)

●更改队列管理器属性, 设置死信队列为NT.DEADQ ALTER QMGR DEADQ(RE240.DEADQ)

●创建本地传输队列RE242:

DEFINE QLOCAL(RE242)+ USAGE(XMITQ) + DEFPSIST(YES)

●创建远程队列 TO.RE242 , 对应于 RE242 上的本地队列 FROM.RE240,

传输队列为RE242:

DEFINE QREMOTE(TO.RE242) + RNAME(FROM.RE240) + RQMNAME(QM_LINUX242) + XMITQ(RE242)

●创建发送通道 RE240.TO.RE242, 使用 TCPIP 协议,远程主机地址为

192.168.1.242 port为1414, 传输队列为RE242:

DEFINE CHANNEL(RE240.TO.RE242)+ CHLTYPE(SDR) + CONNAME('192.168.1.242(1414)') + XMITQ(RE242)

●创建本地监听

DEFINE LISTENER(LN240) + TRPTYPE(TCP) +

PORT(1414) + IPADDR(192.168.1.240) + CONTROL(QMGR)

在product242机器上执行如下操作

创建队列管理器

[mqm@product242 ~] # crtmqm QM_LINUX242

启动队列管理器

[mqm@product242 ~] # strmqm QM_LINUX242

使用MQ控制台命令RUNMQSC配置

runmqsc QM_LINUX242

●创建死信队列:

DEFINE QL(RE242.DEADQ) DEFPSIST(YES)

●更改队列管理器属性, 设置死信队列为NT.DEADQ ALTER QMGR DEADQ(RE242.DEADQ)

●创建本地队列FROM.RE240:

DEFINE QLOCAL(FROM.RE240) DEFPSIST(YES)

●创建接收通道 RE240.TO.RE242, 使用 TCPIP 协议,传输队列为

RE240:

DEFINE CHANNEL(RE240.TO.RE242) CHLTYPE(RCVR)

●创建本地监听

DEFINE LISTENER(LN242) + TRPTYPE(TCP) +

PORT(1414) + IPADDR(192.168.1.242) +

CONTROL(QMGR)

3)分别启动两节点监听

runmqlsr –t TCP –p 1414 –m QM_LINUX240 &

runmqlsr –t TCP –p 1414 –m QM_LINUX242 &

4)启动通道

runmqchl -m QM_LINUX240 -c RE240.TO.RE242 &

或者到MQ控制台里面执行如下命令启动

Runmqsc QM_LINUX240

start CHANNEL(RE240.TO.RE242)

5)MQ TCP连接验证

RE240 向 RE242 发送消息,RE240端运行:

$ cd /opt/mqm/samp/bin或/usr/mqm/samp/bin目录下

./amqsput TO.RE242 QM_LINUX240

在提示下输入字符,每条消息以回车键作结束。若不输任何字符,击回车键时将退出该程序。RE242端在/usr/lpp/mqm/samp/bin 下,运行:

$ cd /opt/mqm/samp/bin

./amqsget FROM.RE240 QM_LINUX242

两个MQ队列管理器之间互相放消息的实现

基于第三章实现的过程,现在我们来实现两个MQ队列管理器之间互相放消息。

MQ TCP连接配置命令

在product242机器上执行如下操作

创建队列管理器

[mqm@product242 ~] # crtmqm WMQM242

启动队列管理器

[mqm@product242 ~] # strmqm WMQM242

查看队列管理器

使用MQ控制台命令RUNMQSC配置

runmqsc WMQM242

●创建死信队列:

DEFINE QL(WMQM240.DEADQ) DEFPSIST(YES)

●更改队列管理器属性, 设置死信队列为NT.DEADQ ALTER QMGR DEADQ(WMQM240.DEADQ)

●创建本地传输队列WMQM240:

DEFINE QLOCAL(WMQM240)+ USAGE(XMITQ) + DEFPSIST(YES)

●创建远程队列 TO. WMQM240 , 对应于 WMQM240 上的本地队列 FROM.

WMQM242, 传输队列为WMQM240:

DEFINE QREMOTE(TO.WMQM240) + RNAME(FROM.WMQM242) + RQMNAME(WMQM240) + 队列管理器的名字

XMITQ(WMQM240)

●创建发送通道 WMQM242.TO.WMQM240, 使用 TCPIP 协议,远程主机地址

为192.168.1.240 port为1415, 传输队列为WMQM240:

DEFINE CHANNEL(WMQM242.TO.WMQM240)+ CHLTYPE(SDR) + CONNAME('192.168.1.240(1415)') + XMITQ(WMQM240)

●创建本地监听

DEFINE LISTENER(LN242) + TRPTYPE(TCP) +

PORT(1415) + IPADDR(192.168.1.242) + CONTROL(QMGR)

说明:上面的监听其实可以不用创建了,因为在第三章的时候已经创建完成了

在product240机器上执行如下操作

创建队列管理器

[mqm@product240 ~] # crtmqm WMQM240

启动队列管理器

[mqm@product240 ~] # strmqm WMQM240

查看队列管理器状态

使用MQ控制台命令RUNMQSC配置

runmqsc WMQM240

●创建死信队列:

DEFINE QL(WMQM240.DEADQ) DEFPSIST(YES)

●更改队列管理器属性, 设置死信队列为WMQM240.DEADQ ALTER QMGR DEADQ(WMQM240.DEADQ)

●创建本地队列FROM.WMQM242:

DEFINE QLOCAL(FROM.WMQM242) DEFPSIST(YES)

●创建接收通道 WMQM242.TO.WMQM240, 使用 TCPIP 协议,传输队列为

WMQM242:

DEFINE CHANNEL(WMQM242.TO.WMQM240) CHLTYPE(RCVR)

●创建本地监听

DEFINE LISTENER(LN240) + TRPTYPE(TCP) +

PORT(1415) + IPADDR(192.168.1.240) + CONTROL(QMGR)

3)分别启动两节点监听

runmqlsr –t TCP –p 1415 –m WMQM240 &

runmqlsr –t TCP –p 1415 –m WMQM242 &

4)在发送端启动通道

runmqchl -m WMQM242 -c WMQM242.TO.WMQM240 &

或者到MQ控制台里面执行如下命令启动

Runmqsc WMQM242

start CHANNEL(WMQM242.TO.WMQM240)

在接收端查看

5)MQ TCP连接验证

WMQM242 向 WMQM240 发送消息, WMQM242端运行:

$ cd /opt/mqm/samp/bin

./amqsput TO. WMQM240 WMQM242

在提示下输入字符,每条消息以回车键作结束。若不输任何字符,击回车键时将退出该程序。WMQM240端在/usr/lpp/mqm/samp/bin 下,运行:

$ cd /opt/mqm/samp/bin

./amqsget FROM.WMQM242 WMQM240

6)总结:

至此实现了两个MQ队列管理器之前相互放消息的目的。不过在搭建该实验也出现了一些问题概况如下:

1. 监听端口:不能重复。

当实现IP242到IP240发生消息时候由于我当时设置的和1414一样导致发送的消息到了第个队列管理器。

2. 正确配置传输队列的名字。

创建发送通道 WMQM242.TO.WMQM240, 使用 TCPIP 协议,远程主机地址为192.168.1.240 port为1415, 传输队列为WMQM240,但是我在创建的时候写成

了WMQM242结果在监听正常、通道都正常的情况下导致发送消息报错如下图:

3.qr queue remote的缩写

rname 指定的远程队列管理器上的队列名

rqname 远程队列管理器

xmitq 所要用的传输队列

由于定义错了远程队列管理器的名字,把其指定为了传输队列的名字,导致了发送的消息到了死信队列里面,查看死信队列。

[mqm@product242 bin]$ ./amqsbcg RE242.DEADQ QM_LINUX242

4.对于关键一些术语要理解才不至于理解不清楚导致失败,仔细分析了总结了一下:

首先了解什么是mq?mq的作用是什么?

mq是通讯中间件。他的作用是省去开发人员开发通讯工具的时间,节省开发成本,提高开发效率。

mq的使用,如何安装mq?

根据以往的经验,win版的mq比较容易安装,傻瓜式,一路next就可以。

aix版本的用smitty安装。

linux版本用rpm -ivh 安装

mq中一些名称的概念:

队列管理器:简单的说就是一个大容器的管理员,这个大容器里放了很多东西。队列:大容器里的东西,存放消息的盒子。

通道:大容器和大容器之间,程序和容器之间进行通讯的途径。

mq是如何实现通讯的?

mq的通讯方式有两种,通俗的说就是mq之间进行通讯,开发的程序和mq之间

的通讯。

mq之间进行通讯:通过发送接收通道建立tcp连接进行消息传输,称为server 对server

开发的程序和mq之间的通讯:通过服务器连接通道进行传输,client对server 如何配置两台mq使之相互进行通讯?

首先要规划好两个队列管理器之间使用的ip和端口,假设我们使用

ip 端口

192.168.1.240 1414

192.168.1.242 1415

第一步建立队列管理器

crtmqm -lc -lf 100 -lp 3 -ls 3 QM1

解释下:

-lc 是采用循环日志

-lf 是每块日志的大小,4k为单位的,100就是100*4k

-lp 是主逻辑日志的数量

-ls 是辅逻辑日志的数量

QM1 是队列管理器名称

第二步启动队列管理器

strmqm QM1

第三步定义队列管理器中的队列和通道等

先运行runmqsc QM1首先要保证运行该命令的用户属于mqm组

运行完后进入mq命令窗口

定义本地队列 def ql(QL1)

先解释什么是本地队列,然后解释命令的含义(以下同)

本地队列是存储信息的盒子,用户可以从本地队列里取消息,对方发送消息的目的地也是本地队列。

def是 define的缩写,mq支持一些命令的缩写。

ql是queue local的缩写,表示本地队列,括号内是本地队列名

定义远程队列 def qr(QR1) rname(QL2) rqname(QM2) xmitq(QT1)

远程队列是相对于本地队列的,当用户希望往另一个队列管理器发消息的时候,配置好远程队列,用户直接放消息到该队列就可以,mq会传输到另一方的本地

队列中。

以上面的例子说明,当我们把消息放入该远程队列后,消息会传输到QM2队列管理器中的QL2队列中。

qr queue remote的缩写

rname 指定的远程队列管理器上的队列名

rqname 远程队列管理器

xmitq 所要用的传输队列

定义传输队列 def ql(QT1) usage(xmitq) trigger trigtype(first) initq (system.channel.initq) trigdata(QM1.QM2)

传输队列是传输的介质,消息是通过传输队列进行传输的。

usage 用途xmitq是传输队列

trigger 消息触发开关

trigtype 触发类型第一条消息触发

initq 初始队列

trigdata 触发数据

定义发送通道 def chl(QM1.QM2) chltype(sdr)

conname('192.168.1.240(1415)') trptype

(tcp) xmitq(QT1)

发送通道就相当于建立一个tcp的连接

chl channel的缩写

chltype 通道类型sdr是发送通道

conname 连接名包括对方的ip和端口

trptype 通讯类型tcp通讯

xmitq 使用的传输队列

定义接受通道 def chl(QM2.QM1)

接收通道是被动的,只定义名字就可以。大家注意,接收通道的名字一定要和发送通道名一致,他们是靠名字来匹配。

第四步配置监听器

是对方mq管理器来探测,本地要给对方一个回应,监听器就是起这个作用的。如果是5.3版本只能在命令行里运行 runmqlsr -m QM1 -t tcp -p 1414

如果是6.0版本可以runmqsc QM1里运行 def listener(LSR.QM1) trptype(tcp) port(1414) control(qmgr)

解释下 trptype 监听类型

port 监听端口

control 监听控制,如果是qmgr则在队列管理器启动的时候监听也自动启动。

第五步配置另外一个队列管理器

简单的说一下,和上面的差不多,只不过名字不一样。

第六步测试两边传输

我们可以用命令行方式向远程队列中放入测试消息,以aix为例,

用/usr/mqm/samp/bin/amqsput命令就可以放入消息,格式为:

amqsput QR1 QM1

解释下:QR1是你要放入的队列名,QM1是你要放入的队列管理器名。

输入以上命令后就可以写入消息了,一下回车就是发送一条消息,两次回车就是

退出。

用/usr/mqm/samp/bin/amqsget命令就可以取消息,格式为

amqsget QL2 QM2

解释下:QL1是你要取消息的队列名,QM2是你要取消息的队列管理器名。

输入完命令后就会显示所有消息。

不过要注意一点,命令行方式的输入和取消息有字节限制。

如果只是简单的浏览一下消息可以使用

/usr/mqm/samp/bin/amqsbcg命令

格式和取消息一样,但是该命令不会把消息取出来,运行完该命令后消息还是保存在队列中。

正常情况下消息的传输流程(只说正常的)

QR1 -> QT1 -> QL2

消息被放入到远程队列中,远程队列通过传输队列传输,最后传输到QM2中的本地队列。

还是不能不能放消息怎么办?

(1)不能放入消息。

一般这种情况应该大部分是远程队列中的传输队列那个参数配置的不正确。

还有可能是队列的允许放入这个参数设置成了禁止。基本上就这两种情况。

(2)发送通道和接收通道的状态不是running

首先说明,如果长时间没有消息传输,通道的状态会变成不活动状态,这是正常现象。

如果你手动启动通道后,通道状态还不是running,那先查看错误日志(两边的队列管理器都要查看)

/var/mqm/qmgrs/QM1/errors中的错误日志,通常编号01的日志是最新日志。常见情况是网络不通导致的通道不通!所以首先要保证网络是正常的,我们可以同过telnet对方的IP加监听端口的方法来查看是不是正常。

telnet 192.168.1.240 1415

再有的情况是两边的配置属性有问题,如两边发送和接收通道名不一致,发送通道的连接名配置错误,发送通道中的传输队列配置错误。

我们也可以执行mq中的一个命令来查看通道是不是正常

runmqsc QM1

ping chl(QM1.QM2)

ping操作来查看两边的通道是不是正常,如果正常会返回ping完成。

(3)放入的消息没有到QM2的队列中

注意:消息一定要放入远程队列中,如果放入传输队列中消息会被放入死信队列中。(上面忘记定义死信队列了,晕)

再有看看远程队列中的属性是不是配置错误,如rname,rqname,xmitq等属性。

也有可能是发送接收队列的消息序列号不一致。如果不一致做一下reset操作。

还有可能是上一批消息没有提交。可以做一个resolve操作。

也是要先看错误日志

(4)消息到达QM2队列QL2中,但是取不出来

QL2的允许取出属性是不是被禁止了。

这样再查看以下QM2到QM1的传输是不是正常。都正常就OK了。

mq是如何实现通讯的(2011-01-27 10:17:27)转载▼标签:杂谈分类: Linux mq的通讯方式有两种,通俗的说就是mq之间进行通讯,开发的程序和mq之间

的通讯。

mq之间进行通讯:通过发送接收通道建立tcp连接进行消息传输,称为server

对server

开发的程序和mq之间的通讯:通过服务器连接通道进行传输,client对server 如何配置两台mq使之相互进行通讯?

首先要规划好两个队列管理器之间使用的ip和端口,假设我们使用

ip 端口

192.168.0.1 1414

192.168.0.2 1415

第一步建立队列管理器

crtmqm -lc -lf 100 -lp 3 -ls 3 QM1

解释下:

-lc 是采用循环日志

-lf 是每块日志的大小,4k为单位的,100就是100*4k

-lp 是主逻辑日志的数量

-ls 是辅逻辑日志的数量

QM1 是队列管理器名称

第二步启动队列管理器

strmqm QM1

第三步定义队列管理器中的队列和通道等

先运行runmqsc QM1首先要保证运行该命令的用户属于mqm组

运行完后进入mq命令窗口

定义本地队列 def ql(QL1)

先解释什么是本地队列,然后解释命令的含义(以下同)

本地队列是存储信息的盒子,用户可以从本地队列里取消息,对方发送消息的目

的地也是本地

队列。

def是 define的缩写,mq支持一些命令的缩写。

ql是queue local的缩写,表示本地队列,括号内是本地队列名

定义远程队列 def qr(QR1) rname(QL2) rqname(QM2) xmitq(QT1)

远程队列是相对于本地队列的,当用户希望往另一个队列管理器发消息的时候,配置好远程队

列,用户直接放消息到该队列就可以,mq会传输到另一方的本地队列中。

以上面的例子说明,当我们把消息放入该远程队列后,消息会传输到QM2队列管

理器中的QL2队

列中。

qr queue remote的缩写

rname 指定的远程队列管理器上的队列名

rqname 远程队列管理器

xmitq 所要用的传输队列

定义传输队列 def ql(QT1) usage(xmitq) trigger trigtype(first) initq

(system.channel.initq) trigdata(QM1.QM2)

传输队列是传输的介质,消息是通过传输队列进行传输的。

usage 用途xmitq是传输队列

trigger 消息触发开关

trigtype 触发类型第一条消息触发

initq 初始队列

trigdata 触发数据

定义发送通道 def chl(QM1.QM2) chltype(sdr) conname('192.168.0.2(1415)') trptype

(tcp) xmitq(QT1)

发送通道就相当于建立一个tcp的连接

chl channel的缩写

chltype 通道类型sdr是发送通道

conname 连接名包括对方的ip和端口

trptype 通讯类型tcp通讯

xmitq 使用的传输队列

定义接受通道 def chl(QM2.QM1)

接收通道是被动的,只定义名字就可以。大家注意,接收通道的名字一定要和发送通道名一致

,他们是靠名字来匹配。

第四步配置监听器

是对方mq管理器来探测,本地要给对方一个回应,监听器就是起这个作用的。如果是5.3版本只能在命令行里运行 runmqlsr -m QM1 -t tcp -p 1414

如果是6.0版本可以runmqsc QM1里运行 def listener(LSR.QM1) trptype(tcp) port(1414)

control(qmgr)

解释下 trptype 监听类型

port 监听端口

control 监听控制,如果是qmgr则在队列管理器启动的时候监听也自动启动。

第五步配置另外一个队列管理器

简单的说一下,和上面的差不多,只不过名字不一样。大家自己尝试下:)

写的手累了,下次补充!

继续

上面我们说完了如何建队列管理器,接下来我们说说建完以后如何测试两边是不是正常传输,

我们可以用命令行方式向远程队列中放入测试消息,以aix为例,

用/usr/mqm/samp/bin/amqsput命令就可以放入消息,格式为:

amqsput QR1 QM1

解释下:QR1是你要放入的队列名,QM1是你要放入的队列管理器名。

输入以上命令后就可以写入消息了,一下回车就是发送一条消息,两次回车就是退出。

用/usr/mqm/samp/bin/amqsget命令就可以取消息,格式为

amqsget QL2 QM2

解释下:QL1是你要取消息的队列名,QM2是你要取消息的队列管理器名。

输入完命令后就会显示所有消息。

不过要注意一点,命令行方式的输入和取消息有字节限制。

如果只是简单的浏览一下消息可以使用

/usr/mqm/samp/bin/amqsbcg命令

格式和取消息一样,但是该命令不会把消息取出来,运行完该命令后消息还是保存在队列中。

正常情况下消息的传输流程(只说正常的,排错一会再说)

QR1 -> QT1 -> QL2

消息被放入到远程队列中,远程队列通过传输队列传输,最后传输到QM2中的本地队列。

出现问题,我们怎么办?

1 不能放入消息。

一般这种情况应该大部分是远程队列中的传输队列那个参数配置的不正确。

还有可能是队列的允许放入这个参数设置成了禁止。基本上就这两种情况。

2 发送通道和接收通道的状态不是running

首先说明,如果长时间没有消息传输,通道的状态会变成不活动状态,这是正常现象。

如果你手动启动通道后,通道状态还不是running,那先查看错误日志(两边的队列管理器都要查看)

/var/mqm/qmgrs/QM1/errors中的错误日志,通常编号01的日志是最新日志。常见情况是网络不通导致的通道不通!所以首先要保证网络是正常的,我们可以同过telnet对方的IP加监听端口的方法来查看是不是正常。

telnet 192.168.0.2 1415

再有的情况是两边的配置属性有问题,如两边发送和接收通道名不一致,发送通道的连接名配置错误,发送通道中的传输队列配置错误。

我们也可以执行mq中的一个命令来查看通道是不是正常

runmqsc QM1

ping chl(QM1.QM2)

ping操作来查看两边的通道是不是正常,如果正常会返回ping完成。

3 放入的消息没有到QM2的队列中

注意:消息一定要放入远程队列中,如果放入传输队列中消息会被放入死信队列中。(上面忘记定义死信队列了,晕)

再有看看远程队列中的属性是不是配置错误,如rname,rqname,xmitq等属性。也有可能是发送接收队列的消息序列号不一致。如果不一致做一下reset操作。还有可能是上一批消息没有提交。可以做一个resolve操作。

也是要先看错误日志

相关文档