WebSphere MQ: メッセージの完全性 (1) Persistent/Non Persistent Message

WebSphere MQにおけるキュー・マネージャー再起動後のローカル・キュー上のパーシステント・メッセージ、ノンパーシステント・メッセージの状態を確認する。(当ブログのWebSphere MQに関する前回の記事はこちら。参考文献は記事末尾をご参照。)

結論から言うと、Persistentメッセージ(ディスク上)はキュー・マネージャーの再起動後も存続し、Non Persistentメッセージ(メモリ上)は消える。

キュー構成の定義

MQSCコマンド・インターフェイスを用いて下記の様にローカル・キューおよび別名キューを作成する。

$ runmqsc qmgr1
Starting MQSC for queue manager qmgr1.
def ql(QL.A) defpsist(yes) replace
     1 : def ql(QL.A) defpsist(yes) replace
AMQ8006: WebSphere MQ queue created.
dis ql(QL.A) defpsist
     2 : dis ql(QL.A) defpsist
AMQ8409: Display Queue details.
   QUEUE(QL.A)                             TYPE(QLOCAL)
   DEFPSIST(YES)
def qa(QA.A) targq(QL.A) defpsist(no) replace
     3 : def qa(QA.A) targq(QL.A) defpsist(no) replace
AMQ8006: WebSphere MQ queue created.
dis qa(QA.A) defpsist
     4 : dis qa(QA.A) defpsist
AMQ8409: Display Queue details.
   QUEUE(QA.A)                             TYPE(QALIAS)
   DEFPSIST(NO)
end
     5 : end
4 MQSC commands read.
No commands have a syntax error.
All valid MQSC commands were processed.
$

Default Persistent属性がYESのローカル・キューQL.AとNOの別名キューQA.Aを作成した。

Persistent/Non Persistent MSGのPUT

これらのキューに対してamqsputサンプル・プログラムでメッセージをputすると対象キューのdefPersistence属性の値により、キューにputされるメッセージがPersistentかNon Persistentかが決まる。

$ amqsput QL.A qmgr1
Sample AMQSPUT0 start
target queue is QL.A
I put in QL.A
Sample AMQSPUT0 end
$ amqsput QA.A qmgr1
Sample AMQSPUT0 start
target queue is QA.A
I put in QA.A
Sample AMQSPUT0 end

putされたメッセージの属性をamqsbcgサンプル・プログラムを用いて確認する。

$ amqsbcg QL.A qmgr1
AMQSBCG0 - starts here
**********************
 MQOPEN - 'QL.A'
 MQGET of message number 1
****Message descriptor****
  StrucId  : 'MD  '  Version : 2
  Report   : 0  MsgType : 8
  Expiry   : -1  Feedback : 0
  Encoding : 546  CodedCharSetId : 1208
  Format : 'MQSTR   '
  Priority : 0  Persistence : 1
  MsgId : X'414D5120716D677231202020202020205F73ED50021D0020'
  CorrelId : X'000000000000000000000000000000000000000000000000'
  BackoutCount : 0
  ReplyToQ       : '                                                '
  ReplyToQMgr    : 'qmgr1                                           '
  ** Identity Context
  UserIdentifier : 'mqm         '
  AccountingToken :
   X'0334393600000000000000000000000000000000000000000000000000000006'
  ApplIdentityData : '                                '
  ** Origin Context
  PutApplType    : '6'
  PutApplName    : 'amqsput                     '
  PutDate  : '20130109'    PutTime  : '14022748'
  ApplOriginData : '    '
  GroupId : X'000000000000000000000000000000000000000000000000'
  MsgSeqNumber   : '1'
  Offset         : '0'
  MsgFlags       : '0'
  OriginalLength : '-1'
****   Message      ****
 length - 13 bytes
00000000:  4920 7075 7420 696E 2051 4C2E 41        'I put in QL.A   '
 MQGET of message number 2
****Message descriptor****
  StrucId  : 'MD  '  Version : 2
  Report   : 0  MsgType : 8
  Expiry   : -1  Feedback : 0
  Encoding : 546  CodedCharSetId : 1208
  Format : 'MQSTR   '
  Priority : 0  Persistence : 0
  MsgId : X'414D5120716D677231202020202020205F73ED50041D0020'
  CorrelId : X'000000000000000000000000000000000000000000000000'
  BackoutCount : 0
  ReplyToQ       : '                                                '
  ReplyToQMgr    : 'qmgr1                                           '
  ** Identity Context
  UserIdentifier : 'mqm         '
  AccountingToken :
   X'0334393600000000000000000000000000000000000000000000000000000006'
  ApplIdentityData : '                                '
  ** Origin Context
  PutApplType    : '6'
  PutApplName    : 'amqsput                     '
  PutDate  : '20130109'    PutTime  : '14024684'
  ApplOriginData : '    '
  GroupId : X'000000000000000000000000000000000000000000000000'
  MsgSeqNumber   : '1'
  Offset         : '0'
  MsgFlags       : '0'
  OriginalLength : '-1'
****   Message      ****
 length - 13 bytes
00000000:  4920 7075 7420 696E 2051 412E 41        'I put in QA.A   '
 No more messages
 MQCLOSE
 MQDISC

確かにQL.AにputしたメッセージはPersistence : 1で、QA.AにputしたメッセージはPersistence : 0となり、それぞれ、キューのdefPersistence属性に沿ったメッセージがputされていることが分かる。

キュー・マネージャーの停止→再起動

障害の発生を想定してendmqm -i オプションで即時終了(実行中のMQIコール終了後に終了)させた後、再度起動し、各メッセージの存続を確認する。

$ endmqm -i qmgr1
WebSphere MQ queue manager 'qmgr1' ending.
WebSphere MQ queue manager 'qmgr1' ended.
$ strmqm qmgr1
WebSphere MQ queue manager 'qmgr1' starting.
5 log records accessed on queue manager 'qmgr1' during the log replay phase.
Log replay for queue manager 'qmgr1' complete.
Transaction manager state recovered for queue manager 'qmgr1'.
WebSphere MQ queue manager 'qmgr1' started.
$ amqsbcg QL.A qmgr1
AMQSBCG0 - starts here
**********************
 MQOPEN - 'QL.A'
 MQGET of message number 1
****Message descriptor****
  StrucId  : 'MD  '  Version : 2
  Report   : 0  MsgType : 8
  Expiry   : -1  Feedback : 0
  Encoding : 546  CodedCharSetId : 1208
  Format : 'MQSTR   '
  Priority : 0  Persistence : 1
  MsgId : X'414D5120716D677231202020202020205F73ED50021D0020'
  CorrelId : X'000000000000000000000000000000000000000000000000'
  BackoutCount : 0
  ReplyToQ       : '                                                '
  ReplyToQMgr    : 'qmgr1                                           '
  ** Identity Context
  UserIdentifier : 'mqm         '
  AccountingToken :
   X'0334393600000000000000000000000000000000000000000000000000000006'
  ApplIdentityData : '                                '
  ** Origin Context
  PutApplType    : '6'
  PutApplName    : 'amqsput                     '
  PutDate  : '20130109'    PutTime  : '14022748'
  ApplOriginData : '    '
  GroupId : X'000000000000000000000000000000000000000000000000'
  MsgSeqNumber   : '1'
  Offset         : '0'
  MsgFlags       : '0'
  OriginalLength : '-1'
****   Message      ****
 length - 13 bytes
00000000:  4920 7075 7420 696E 2051 4C2E 41        'I put in QL.A   '
 No more messages
 MQCLOSE
 MQDISC

確かに、Non Persistent メッセージが消えていることを確認できた。

参考ドキュメント