Websphere MQ消息序号Message Sequence详解

一.什么是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

你可能感兴趣的:(MQ,websphere)