一.什么是MQ的消息序号?
通道为每一条消息的传送分配了一个序列号,它会自动累计增值。
消息序列号由发送通道分配,是通道的一个永久属性,每当发送一条消息,消息序列号就加一。
通道的相关属性SEQWRAP 表示序号的最大值,缺省为999,999,999。序列号越界后自动归零,从头开始。
消息序列号是保证MQ消息传输不丢失、不复传的一个重要机制,通道利用消息序号来标识传送和确认的消息。
二.怎么查看通道当前的消息序号?
无论是在发送端还是接收端,在MQSC下输入如下命令,其中CURSEQNO即为当前消息序号:
$ runmqsc QM dis chs(C) all AMQ8417: Display Channel Status details. CHANNEL(C) XMITQ( ) CONNAME(127.0.0.1) CURRENT CHLTYPE(RCVR) INDOUBT(NO) LSTSEQNO(0) LSTLUWID(0000000000000000) CURMSGS(0) CURSEQNO(3) CURLUWID(45BF8B5021200000) STATUS(RUNNING) LSTMSGTI(21.36.03) LSTMSGDA(2012-10-27) MSGS(3) BYTSSENT(328) BYTSRCVD(1783) BATCHES(7) BATCHSZ(50) HBINT(300) NPMSPEED(FAST) CHSTATI(21.14.41) CHSTADA(2012-10-27) BUFSSENT(8) BUFSRCVD(11) LONGRTS(999999999) SHORTRTS(10) JOBNAME(00000AD500000023) MCASTAT(RUNNING) STOPREQ(NO)
三.正常情况下的通道两端消息序号是怎样的?
正常情况下,通道两端的消息序列号或者相等或者相差为一。
四.什么原因会导致消息序号不一致?
1.通信故障:双方对前面的某一条(或一批) 消息是否发送成功理解不一致。在解决了不确定(In-doubt) 的消息后,可以用 MQSC 命令通过重置消息序号将双方调整到一致。
2./var/mqm 使用旧的备份恢复
3.某一方MQ系统重新安装
4.队列管理器重建
5.某一方通道重建
6.某一方通道被重置
五.消息序号不一致会导致什么问题发生?
通道序号不一致会导致通道无法正常启动(即状态不是running),通道状态为retrying。
MQ日志会有错误记录,比如/var/mqm/qmgrs/队列管理器名称/errors/AMQERR01.LOG的内容:
--------------------------------------------------------- AMQ9526: 通道 'SDR.TEST' 的消息序号出错 或者 Message sequence number error for channel 'SDR.TEST' 说明: 本地和远程队列管理器对下一个消息序号不一致。当希望消息序号 1 时,发送了序号为 101 的消息。 操作: 确定该不一致的原因。有可能同步信息已损坏, 或已被逆序恢复成先前的版本。如果问题不能解决, 可用 RESET CHANNEL 命令在通道的发送端人工复位此序号。 ---------------------------------------------------------
六.消息序号不一致问题发生后怎么处理?
方法一:在通道发送端用 MQSC 命令,重置消息序号为1,稍后通道两端消息序号会被同步为1。
示例:在发送端将消息序号重置为1(默认为1,不是0) RESET CHANNEL (C) 等于 RESET CHANNEL (C) SEQNUM(1)
注意:在连接通道的主动方重置消息序号会将双方一起调整,在被动方重置则只设置一端。因为一旦连接断开后,通道重连时双方 MCA 会将消息序号同步。
建议:在发送端和接收端同时重置消息序号,这样能快速解决序号不一致的问题。
方法二:在通道接收方用MQSC命令将消息序号重置为与发送端相同(“5、消息序号不一致会导致什么问题发生?” 中的日志记录了发送方通道的序号)
示例:将接收通道消息序号重置为与发送通道的101: reset channel(C) seqnum(101)
七.MQ启动后是否需要重置消息序号?
MQ的消息序号是通道的一个永久属性,正常情况下,无论是重新启动队列管理器还是重新启动计算机,通道序列号都不会因此而变化,因而不需要进行重置操作。
八.常见问题
问题:MQ 重置通道序列号不生效
请检查您重置的通道是发送通道还是接收通道,如果重置接收通道肯定只能重置接收通道的序号,并不能改变发送通道的序号,一样会消息序号出错,当然,也可以查找到发送通道的消息序号,然后将接收通道的消息序号重置成与发送通道相同的值。
具体请参考 - 6、消息序号不一致问题发生后怎么处理?
文章来源:http://www.wo81.com/tec/mid/mq/2014-04-14/109.html