免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9323 | 回复: 9
打印 上一主题 下一主题

MQ使用经验总结(未完持续) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-04 10:54 |只看该作者 |倒序浏览
mq经验总结
首先了解什么是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.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操作。
也是要先看错误日志

4 消息到达QM2队列QL2中,但是取不出来
QL2的允许取出属性是不是被禁止了。

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

下次继续补充!

[ 本帖最后由 WebSphereMQ6.0 于 2008-1-7 09:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-04 10:55 |只看该作者
沙发留

论坛徽章:
0
3 [报告]
发表于 2008-01-05 19:03 |只看该作者
顶,想问楼主一个问题,我A机器通过MQ发送成功,但在B机器接收端的接收队列取不到消息.,是为什么呢?

论坛徽章:
0
4 [报告]
发表于 2008-01-07 08:33 |只看该作者
遇到这种情况你要先看A机器和B机的传输有没有问题,比如AB之间的发送接收通道是不是running状态,你放入A机的消息是不是存留在传输队列中?消息是不是进入死信队列?或者察看一下错误日志.
如果在B机中看到了消息,但是取不出来,看看你队列的属性是不是设置有问题,比如是否允许取出消息?基本上应该差不多了.呵呵.

论坛徽章:
0
5 [报告]
发表于 2008-01-07 22:09 |只看该作者
刚好在搞,学习了!!

论坛徽章:
0
6 [报告]
发表于 2008-01-08 21:29 |只看该作者
楼主,你用的mq太熟了,能多发点mq的文章吗?我现在刚学mq,并且正在用这个开发项目,现在是一头雾水,多谢指教了

论坛徽章:
0
7 [报告]
发表于 2008-01-11 15:48 |只看该作者
MQ的使用非常简单,  我倒认为难点在于如何理解MQ的使用.
----他的作用是省去开发人员开发通讯工具的时间,节省开发成本,提高开发效
上句话讲完等于没讲, 没用过的人根本无法理解.

还有:  我还不太清楚所谓系统的互相通信到底作用在哪里?  能否举个例子?

另外关于消息这个术语, 看起来很简单, 不知道在真正使用过程消息到底是一个文本呢? 还是一个select的结果集呢? 还是什么?

论坛徽章:
0
8 [报告]
发表于 2008-01-12 16:24 |只看该作者
请问有什么命令或工具可以导出AIX下MQ的配置信息(如:队列,通道...)吗?

论坛徽章:
0
9 [报告]
发表于 2008-01-24 10:19 |只看该作者
队列消息很难

论坛徽章:
0
10 [报告]
发表于 2008-02-29 18:40 |只看该作者

回复 #1 WebSphereMQ6.0 的帖子

请问LZ,队列管理器名字是否可以随便起?是否会影响通讯?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP