実践習得 IBM MQの基本
メッセージ記述子(MQMD V2)(2)
※本連載は最新のmqpgf/mqpcfに基づいて改定されることがあります。常に最新バージョンをダウンロードしてご使用ください。
MQRFH2ヘッダーを持つメッセージのセグメント化
MQメッセージにMQRFH2ヘッダーもしくは、他のヘッダーが使用されている場合に、グループ化やアプリケーションでセグメント化を行う場合には、いくつかの注意点があります。 以下、MQRFH2を例にご説明します。 MQRFH2ヘッダーは、MQのメッセージ・プロパティや、JMSプロパティを取り扱う場合に使用されるヘッダですが、それ自体の詳細については、機会を改めてご紹介します。
セグメントのサイズについての注意点
MQMF_SEGMENTATION_ALLOWEDを指定して、キューマネージャーにセグメント分割をさせる場合、セグメントに分割されるサイズはMQRFH2よりも大きいことが必要になります。 もしも、MQRFH2のサイズがセグメント分割されるサイズよりも大きい場合、MQRC_MSG_TOO_BIG_FOR_Q(2030)でMQPUT()が異常終了します。 MQRFH2ヘッダーは可変長ですので念のためこのことをお伝えしておきますが、実際にはMQRFH2ヘッダーより小さいサイズでセグメント化することも、セグメント化したいサイズよりも大きなMQRFH2ヘッダーが付加されることも、かなり特殊な状況下でないかぎりは発生しないと考えられます。
mqpgfでMQRFH2ヘッダーを付加したメッセージを作成するには、下記オプションでMQRFH2ヘッダーのフィールドの値を一つ以上指定します。
$ mqpgf
....
MQRFH2 fields:
-re : Encoding(
-rc : CodedCharSetId(
-rf : Format(e.g. -rf MQFMT_STRING)
-fg : Flags -nc : NameValueCCSID(
-nd : NameValueData(e.g. -nd "data1,data2,data3")
....
Ex. 5.1 RFHヘッダーを持つメッセージのセグメント化が失敗する例
"-nd": NameValueDataに任意のXML形式のデータを指定してメッセージをPUTしてみます。
$ mqpgf -qm SampleQM -q SampleQ -m "RFH2 Segmentation" -nd "
[18/06/11 15:42:03] 1: message length: 17 put message: RFH2 Segmentation
*オプションの説明
-nd: 指定されたデータをMQRFH2ヘッダのNameValudeデータに設定
MQFMT_RF_HEADER_2: MQMD.FormatにMQFMT_RF_HEADER_2を設定
MQMF_SEGMENTATION_ALLOWED: MQMD.MsgFlagsにMQMF_SEGMENTATION_ALLOWEDを設定
"-dpv"または"-brv"で詳細モードでダンプすると、MQRFH2ヘッダーはMQMDと同様の見やすい形式で表示されます。
$ mqpgf -qm SampleQM -q SampleQ -dpv
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[MQHRF2 ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20002907] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[06420393] ApplOriginData[ ]
GroupId[0x000000000000000000000000000000000000000000000000] MsgSeqNumber[1] Offset[0] MsgFlags[0] OriginalLength[-1]
*StrucId[RFH ] Version[2] StrucLength[104] Encoding[273] CodedCharSetId[943] Format[ ] Flags[0] NameValueCCSID[1208]
NameValueLength[64] NameValueData[
data length: 121
00000000: 5246 4832 2053 6567 6D65 6E74 6174 696F 'RFH2 Segmentatio'
00000010: 6E 'n '
MQRFH2.StrucLengthの値が、NameValueDataも含むMQRFH2ヘッダー全体の長さです。 この例では104バイトです。 キューのMAXMSGLをこの長さより小さい値の100に設定して、キューマネージャーでセグメント分割するように指定してみます。
テスト結果5.1.1
$ echo "alter ql('SampleQ') MAXMSGL(100)" | runmqsc SampleQM
....
$ mqpgf -qm SampleQM -q SampleQ -m "RFH2 Segmentation" -nd "
[18/06/11 16:00:12] 1: message length: 17 put message: RFH2 Segmentation
MQPUT fail : SampleQ CompCd=02 ReasonCd=2030
$ mqrc 2030
2030 0x000007ee MQRC_MSG_TOO_BIG_FOR_Q
$ echo "alter ql('SampleQ') MAXMSGL(4194304)" | runmqsc SampleQM
....
MQRC_MSG_TOO_BIG_FOR_Q(2030)でMQPUT()が失敗します。
同様の条件でアプリケーションでセグメント化する場合、MQRFH2ヘッダーが不完全になる為、MQRC_HEADER_ERROR(2142)で失敗します。
テスト結果5.1.2
$ mqpgf -qm SampleQM -q SampleQ -m "RFH2 Segmentation" -as 100 -nd "
[18/06/11 17:51:52] 1: message length: 17 put message: RFH2 Segmentation
[18/06/11 17:51:52] 1: logical message: 1 length: 121 put message: RFH .......h........ ...........@
[18/06/11 17:51:52] 1: segment: 1 length: 100 put message: RFH .......h........ ...........@
$ mqrc 2142
2142 0x0000085e MQRC_HEADER_ERROR
条件を変えていろいろと試して見てください。
CodedCharSetId、Encoding、Formatを設定する場合の注意点
MQRFH2ヘッダーが使用されている場合は、MQMDのCodedCharSetId、Encoding、Formatはユーザー・データではなく、MQRFH2についてのそれぞれの形式を表していることに注意してください。 そして、ユーザー・データについてのそれぞれの形式は、MQMDではなく、直前のヘッダであるMQRFH2のCodedCharSetId、Encoding、Formatに指定されています。 キューマネージャーでセグメント分割する場合には、キューマネージャーがMQRFH2ヘッダーが含まれていない2件目以降のMQMDのCodedCharSetId、Encoding、FormatにMQRFH2ヘッダのCodedCharSetId、Encoding、Formatを自動的に設定します。 アプリケーションでメッセージを分割する場合は、アプリケーションがこれを実施する必要があります。
Ex. 5.2 RFHヘッダーを持つメッセージをキューマネージャーにセグメント化させる
まずは、Qmgrにセグメンテーションを行わせて確認してみます。
$ echo "alter ql('SampleQ') MAXMSGL(200)" | runmqsc SampleQM
....
$ mqpgf -qm SampleQM -q SampleQ -f largemsg.txt -nd "
[18/06/11 16:32:50] 1: put from: largemsg.txt
*オプションの説明
-nd: 指定されたデータをMQRFH2ヘッダのNameValudeデータに設定
MQFMT_RF_HEADER_2: MQMD.FormatにMQFMT_RF_HEADER_2を設定
MQMF_SEGMENTATION_ALLOWED: MQMD.MsgFlagsにMQMF_SEGMENTATION_ALLOWEDを設定
テスト結果5.2
$ mqpgf -qm SampleQM -q SampleQ -dpv -r
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[MQHRF2 ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003302] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[07325079] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003303] MsgSeqNumber[1] Offset[0] MsgFlags[3] OriginalLength[192]
*StrucId[RFH ] Version[2] StrucLength[104] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Flags[0] NameValueCCSID[1208]
NameValueLength[64] NameValueData[
data length: 192
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 0A31 'mnopqrstuvqxyz.1'
00000040: 3233 3435 3637 3839 3041 4243 4445 4647 '234567890ABCDEFG'
00000050: 4849 4A4B 4C4D 4E4F 'HIJKLMNO '
message number: 2
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003304] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[07325079] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003303] MsgSeqNumber[1] Offset[192] MsgFlags[3] OriginalLength[192]
data length: 192
00000000: 5051 5253 5455 5657 5859 5A61 6263 6465 'PQRSTUVWXYZabcde'
00000010: 6667 6869 6A6B 6C6D 6E6F 7071 7273 7475 'fghijklmnopqrstu'
00000020: 7671 7879 7A0A 3132 3334 3536 3738 3930 'vqxyz.1234567890'
00000030: 4142 4344 4546 4748 494A 4B4C 4D4E 4F50 'ABCDEFGHIJKLMNOP'
00000040: 5152 5354 5556 5758 595A 6162 6364 6566 'QRSTUVWXYZabcdef'
00000050: 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 'ghijklmnopqrstuv'
00000060: 7178 797A 0A31 3233 3435 3637 3839 3041 'qxyz.1234567890A'
00000070: 4243 4445 4647 4849 4A4B 4C4D 4E4F 5051 'BCDEFGHIJKLMNOPQ'
00000080: 5253 5455 5657 5859 5A61 6263 6465 6667 'RSTUVWXYZabcdefg'
00000090: 6869 6A6B 6C6D 6E6F 7071 7273 7475 7671 'hijklmnopqrstuvq'
000000A0: 7879 7A0A 3132 3334 3536 3738 3930 4142 'xyz.1234567890AB'
000000B0: 4344 4546 4748 494A 4B4C 4D4E 4F50 5152 'CDEFGHIJKLMNOPQR'
message number: 3
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003305] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[07325079] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003303] MsgSeqNumber[1] Offset[384] MsgFlags[7] OriginalLength[35]
data length: 35
00000000: 5354 5556 5758 595A 6162 6364 6566 6768 'STUVWXYZabcdefgh'
00000010: 696A 6B6C 6D6E 6F70 7172 7374 7576 7178 'ijklmnopqrstuvqx'
00000020: 797A 0A 'yz. '
no message available : SampleQ CompCd=02 ReasonCd=2033
最初のMQMDに設定されている各フィールドの値はテストしたマシンのデフォルトです。 2番目以降のメッセージのMQMDのフィールドにはMQRFH2ヘッダーに指定した値が使用されていることが確認できます。
場所 | Encoding | CodedCharSetId | Format |
---|---|---|---|
先頭のメッセージのMQMD | 273 | 943 | "MQHRF2 " |
MQRFH2ヘッダ | 546 | 932 | "MQSTR " |
2番目以降のメッセージのMQMD | 546 | 932 | "MQSTR " |
先にご紹介した様に、mqpgfは与えられたメッセージを分割して複数の論理メッセージにすることができます。 この時にMQRFH2ヘッダーの項目を指定すると、mqpgfは先頭の論理メッセージのみにMQRFH2ヘッダーを付与します。 その為、2番目以降の論理メッセージがキューマネージャーによってセグメント分割する場合、MQRFH2ヘッダーのCodedCharSetId、Encoding、FormatはセグメントのMQMDにコピーされません。セグメント化される論理メッセージがMQRFH2ヘッダーを持っていないのですから、当然そうなります。 もしも、同様の処理をユーザーのアプリケーションが行う場合、アプリケーションが2件目以降の論理メッセージのMQMDにMQRFH2ヘッダーのCodedCharSetId、Encoding、Formatをコピーすることが必要になります。 mqpgfは、グループ化された論理メッセージを作成する場合と、アプリケーション(mqpgf自身)がセグメント化を実行する場合に、この処理を行っています。
※グループ化された論理メッセージにもこの処理を適用するのは、mqpgfのメッセージを分割することによってグループ化されたメッセージを作成するという仕様上の特殊な要件によっています。 通常はアプリケーションでセグメント化を実施する場合に注意が必要です。
Ex. 5.3 先頭の論理メッセージにRFHヘッダーを持つ場合のグループ化とセグメント化
下記のデータにRFH2を付加して、改行を論理グループのデリミタ(-dl 0x0a)とし、アプリケーションで100バイト(-as 100)でセグメント分割してみます。
$ cat largemsg3.txt
1234567890
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz12345678901234567890123456789012345678901234567890
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
$ mqpgf -qm SampleQM -q SampleQ -f largemsg3.txt -dl 0x0a -as 100 MQMD_VERSION_2 MQPMO_LOGICAL_ORDER MQPMO_SYNCPOINT MQFMT_RF_HEADER_2 -nd "
[18/06/11 18:06:11] 1: put from: largemsg3.txt
[18/06/11 18:06:11] 1: logical message: 1 length: 86 put message: RFH .......L..."....MQSTR ...........$
[18/06/11 18:06:11] 1: logical message: 2 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/11 18:06:11] 1: logical message: 3 length: 112 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz12345678901234567890123456789012345678901234567890
[18/06/11 18:06:11] 1: segment: 1 length: 100 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz12345678901234567890123456789012345678
[18/06/11 18:06:11] 1: segment: 2 length: 12 put message: 901234567890
[18/06/11 18:06:11] 1: logical message: 4 length: 36 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
[18/06/11 18:06:11] 1: logical message: 5 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
MQCMIT success : CompCd=00 ReasonCd=00
テスト結果5.3
$ mqpgf -qm SampleQM -q SampleQ -dpv -r
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[MQHRF2 ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003B03] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[09061145] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003B04] MsgSeqNumber[1] Offset[0] MsgFlags[8] OriginalLength[-1]
*StrucId[RFH ] Version[2] StrucLength[76] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Flags[0] NameValueCCSID[1208]
NameValueLength[36] NameValueData[
data length: 86
00000000: 3132 3334 3536 3738 3930 '1234567890 '
message number: 2
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003B05] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[09061146] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003B04] MsgSeqNumber[2] Offset[0] MsgFlags[8] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 3
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003B06] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[09061146] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003B04] MsgSeqNumber[3] Offset[0] MsgFlags[10] OriginalLength[100]
data length: 100
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 3132 'mnopqrstuvqxyz12'
00000040: 3334 3536 3738 3930 3132 3334 3536 3738 '3456789012345678'
00000050: 3930 3132 3334 3536 3738 3930 3132 3334 '9012345678901234'
00000060: 3536 3738 '5678 '
message number: 4
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003B07] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[09061146] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003B04] MsgSeqNumber[3] Offset[100] MsgFlags[14] OriginalLength[12]
data length: 12
00000000: 3930 3132 3334 3536 3738 3930 '901234567890 '
message number: 5
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003B08] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[09061146] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003B04] MsgSeqNumber[4] Offset[0] MsgFlags[8] OriginalLength[-1]
data length: 36
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 'WXYZ '
message number: 6
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[546] CodedCharSetId[932] Format[MQSTR ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B1E078C20003B09] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180611] PutTime[09061146] ApplOriginData[ ]
GroupId[0x414D512053616D706C65514D202020205B1E078C20003B04] MsgSeqNumber[5] Offset[0] MsgFlags[24] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
no message available : SampleQ CompCd=02 ReasonCd=2033
先頭の物理メッセージ以外の全ての論理メッセージ、セグメントのMQMDにMQRFH2ヘッダーのCodedCharSetId、Encoding、Formatが設定されています。
特定のグループの特定の論理メッセージ、特定のセグメントを指定して読み込む方法
MQMD V2のGroupId、MsgSeqNumber、Offsetを指定して特定の物理メッセージをGETすることができます。
MQGMO_VERSION_2を使用すると、下記のマッチ・オプションが使用可能になります。
キューの最初のメッセージ | MQMO_NONE |
MsgId に一致する最初のメッセージ | MQMO_MATCH_MSG_ID |
CorrelId に一致する最初のメッセージ | MQMO_MATCH_CORREL_ID |
GroupId に一致する最初のメッセージ | MQMO_MATCH_GROUP_ID |
MsgSeqNumber に一致する最初のメッセージ | MQMO_MATCH_MSG_SEQ_NUMBER |
MsgToken に一致する最初のメッセージ | MQMO_MATCH_MSG_TOKEN |
Offset に一致する最初のメッセージ | MQMO_MATCH_OFFSET |
Ex. 5.4 特定のグループ、論理メッセージ、セグメントを指定して読み込む
MQMO_MATCH_GROUP_ID、MQMO_MATCH_MSG_SEQ_NUMBER、MQMO_MATCH_OFFSETを指定しながらMQGET()することで、MQGMO_LOGICAL_ORDERを使用した場合と同じ様にメッセージを論理順序でGETすることができます。
「Ex. 4.7 グループ・メッセージの論理順序での読み込み」と同様に2つのグループの物理メッセージをランダムにPUTしてみます。
$ mqpgf -qm SampleQM -q SampleQ -m Group2Logical2Segment2 -gi GroupId2 -ms 2 -of 22 MQMD_VERSION_2 MQMF_LAST_SEGMENT MQMF_LAST_MSG_IN_GROUP
[18/05/29 15:57:11] 1: message length: 22 put message: Group2Logical2Segment2
$ mqpgf -qm SampleQM -q SampleQ -m Group1Logical3Segment2 -gi GroupId1 -ms 3 -of 22 MQMD_VERSION_2 MQMF_LAST_SEGMENT MQMF_LAST_MSG_IN_GROUP
[18/05/29 15:57:41] 1: message length: 22 put message: Group1Logical3Segment2
$ mqpgf -qm SampleQM -q SampleQ -m Group2Logical2Segment1 -gi GroupId2 -ms 2 -of 0 MQMD_VERSION_2 MQMF_SEGMENT MQMF_LAST_MSG_IN_GROUP
[18/05/29 15:57:54] 1: message length: 22 put message: Group2Logical2Segment1
$ mqpgf -qm SampleQM -q SampleQ -m Group1Logical3Segment1 -gi GroupId1 -ms 3 -of 0 MQMD_VERSION_2 MQMF_SEGMENT MQMF_LAST_MSG_IN_GROUP
[18/05/29 15:58:08] 1: message length: 22 put message: Group1Logical3Segment1
$ mqpgf -qm SampleQM -q SampleQ -m Group1Logical2 -gi GroupId1 -ms 2 MQMD_VERSION_2 MQMF_MSG_IN_GROUP
[18/05/29 15:58:27] 1: message length: 14 put message: Group1Logical2
$ mqpgf -qm SampleQM -q SampleQ -m Group1Logical1Segment2 -gi GroupId1 -ms 1 -of 22 MQMD_VERSION_2 MQMF_LAST_SEGMENT MQMF_MSG_IN_GROUP
[18/05/29 15:58:41] 1: message length: 22 put message: Group1Logical1Segment2
$ mqpgf -qm SampleQM -q SampleQ -m Group2Logical1 -gi GroupId2 -ms 1 MQMD_VERSION_2 MQMF_MSG_IN_GROUP
[18/05/29 15:58:53] 1: message length: 14 put message: Group2Logical1
$ mqpgf -qm SampleQM -q SampleQ -m Group1Logical1Segment1 -gi GroupId1 -ms 1 -of 0 MQMD_VERSION_2 MQMF_SEGMENT MQMF_MSG_IN_GROUP
[18/05/29 16:02:41] 1: message length: 22 put message: Group1Logical1Segment1
GroupId、MsgSeqNumber、Offsetを指定しながら順にメッセージを取得します。
テスト結果5.4
$ mqpgf -qm SampleQM -q SampleQ -dpv -gi GroupId1 MQMO_MATCH_GROUP_ID -ms 1 MQMO_MATCH_MSG_SEQ_NUMBER -of 0 MQMO_MATCH_OFFSET MQMD_VERSION_2 MQGMO_VERSION_2
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B0CF7E320002403] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180529] PutTime[07024120] ApplOriginData[ ]
GroupId[0x47726F757049643100000000000000000000000000000000] MsgSeqNumber[1] Offset[0] MsgFlags[10] OriginalLength[22]
data length: 22
00000000: 4772 6F75 7031 4C6F 6769 6361 6C31 5365 'Group1Logical1Se'
00000010: 676D 656E 7431 'gment1 '
$ mqpgf -qm SampleQM -q SampleQ -dpv -gi GroupId1 MQMO_MATCH_GROUP_ID -ms 1 MQMO_MATCH_MSG_SEQ_NUMBER -of 22 MQMO_MATCH_OFFSET MQMD_VERSION_2 MQGMO_VERSION_2
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B0CF7E320002332] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180529] PutTime[06584183] ApplOriginData[ ]
GroupId[0x47726F757049643100000000000000000000000000000000] MsgSeqNumber[1] Offset[22] MsgFlags[14] OriginalLength[22]
data length: 22
00000000: 4772 6F75 7031 4C6F 6769 6361 6C31 5365 'Group1Logical1Se'
00000010: 676D 656E 7432 'gment2 '
$ mqpgf -qm SampleQM -q SampleQ -dpv -gi GroupId1 MQMO_MATCH_GROUP_ID -ms 2 MQMO_MATCH_MSG_SEQ_NUMBER -of 0 MQMO_MATCH_OFFSET MQMD_VERSION_2 MQGMO_VERSION_2
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B0CF7E320002330] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180529] PutTime[06582712] ApplOriginData[ ]
GroupId[0x47726F757049643100000000000000000000000000000000] MsgSeqNumber[2] Offset[0] MsgFlags[8] OriginalLength[-1]
data length: 14
00000000: 4772 6F75 7031 4C6F 6769 6361 6C32 'Group1Logical2 '
$ mqpgf -qm SampleQM -q SampleQ -dpv -gi GroupId1 MQMO_MATCH_GROUP_ID -ms 3 MQMO_MATCH_MSG_SEQ_NUMBER -of 0 MQMO_MATCH_OFFSET MQMD_VERSION_2 MQGMO_VERSION_2
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B0CF7E32000232E] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180529] PutTime[06580859] ApplOriginData[ ]
GroupId[0x47726F757049643100000000000000000000000000000000] MsgSeqNumber[3] Offset[0] MsgFlags[26] OriginalLength[22]
data length: 22
00000000: 4772 6F75 7031 4C6F 6769 6361 6C33 5365 'Group1Logical3Se'
00000010: 676D 656E 7431 'gment1 '
$ mqpgf -qm SampleQM -q SampleQ -dpv -gi GroupId1 MQMO_MATCH_GROUP_ID -ms 3 MQMO_MATCH_MSG_SEQ_NUMBER -of 22 MQMO_MATCH_OFFSET MQMD_VERSION_2 MQGMO_VERSION_2
message number: 1
*StrucId[MD ] Version[2] Report[0] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[943] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512053616D706C65514D202020205B0CF7E32000232A] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[SampleQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180529] PutTime[06574153] ApplOriginData[ ]
GroupId[0x47726F757049643100000000000000000000000000000000] MsgSeqNumber[3] Offset[22] MsgFlags[30] OriginalLength[22]
data length: 22
00000000: 4772 6F75 7031 4C6F 6769 6361 6C33 5365 'Group1Logical3Se'
00000010: 676D 656E 7432 'gment2 '
"GropuId1"の物理メッセージが到着順に関わらず論理順序で読み出せています。
MQクラスターとグループ・メッセージおよびセグメント化
同一グループの論理メッセージの宛先の固定
MQクラスタ環境を構成している場合、同一グループに属するメッセージを同じ宛先に送信したい場合があります。 MQOPEN()時のオプションで、MQOO_BIND_ON_GROUPを使用すると、グループ単位で同名のクラスタ・キューに対して負荷分散させることができます。 MQOO_BIND_ON_OPEN(デフォルトの動作)を使用することもできますが、このオプションを使用するとMQOPEN()を発行時に宛先が固定される為、グループ毎にクラスタ・キューを再オープンすることが必要になります。 MQOO_BIND_NOT_FIXEDを使用した場合は、ワークロード・バランスの結果として、同一グループの論理メッセージが別々の宛先に送信されます。
(MQクラスター構成の作成)
既存のテスト環境に設定を追加して、簡単なクラスター環境を作成します。 通常の分散キューイング環境(SDR/RCVRチャネル等を使用)と、MQクラスター構成は問題なく共存可能です。 SampleQMとRemoteQMをどちらも"PLSRCLUS"というクラスター名のフル・リポジトリ・キューマネージャーにします。 MQクラスター内には、2つのフル・リポジトリ・キューマネージャーを作成することが必要です。 新たに、パーシャル・リポジトリ・キューマネージャーとしてPartialQMを作成します。
<< SampleQMでの作業 >>
qmgrのreposプロパティにクラスタ名を指定し、クラスター受信側チャネルを作成します。 注意点としてはconnameに指定する接続名は、自分自身を指す内容を指定します。 分かりにくいかと思いますが、自動定義されるCLUSSDRチャネルは、受信側のキュー・マネージャーのCLUSRCVRチャネル定義の属性を使用します。 手動で定義されたCLUSSDRチャネルがある場合でも、自動定義されたCLUSSDRチャネルからの属性が使用されることに注意してください。 また、手動定義のクラスター送信側チャネルとクラスター受信側チャネルの属性は完全に一致させることが推奨です。
$ runmqsc SampleQM
....
MQSC > alter qmgr repos(PLSRCLUS)
1 : alter qmgr repos(PLSRCLUS)
AMQ8005: IBM MQ queue manager changed.
MQSC > def chl('TO.SampleQM') chltype(clusrcvr) conname('localhost(1414)') cluster(PLSRCLUS)
2 : def chl('TO.SampleQM') chltype(clusrcvr) conname('localhost(1414)') cluster(PLSRCLUS)
AMQ8014: IBM MQ channel created.
<< RemoteQMでの作業 >>
RemoteQMでも同様の作業を行います。
$ runmqsc RemoteQM
....
MQSC > alter qmgr repos(PLSRCLUS)
1 : alter qmgr repos(PLSRCLUS)
AMQ8005: IBM MQ queue manager changed.
MQSC > def chl('TO.SampleQM') chltype(clusrcvr) conname('localhost(1414)') cluster(PLSRCLUS)
2 : def chl('TO.SampleQM') chltype(clusrcvr) conname('localhost(1414)') cluster(PLSRCLUS)
AMQ8014: IBM MQ channel created.
<< SampleQMでの作業 >>
手動定義のクラスター送信側チャネルを作成します。 クラスターに所属するキュー・マネージャーは必ずフル・リポジトリ―・キューマネージャーに接続する手動定義のクラスター送信側チャネルを定義することが必要です。 自身がフル・リポジトリ―・キューマネージャーである場合は、他のフル・リポジトリ―・キューマネージャーを指すクラスター送信側チャネルを全て定義します。
MQSC > def chl('TO.RemoteQM') chltype(clussdr) conname('localhost(1415)') cluster(PLSRCLUS)
3 : def chl('TO.RemoteQM') chltype(clussdr) conname('localhost(1415)') cluster(PLSRCLUS)
AMQ8014: IBM MQ channel created.
<< RemoteQMでの作業 >>
RemoteQMでも同様の作業を行います。
MQSC > def chl('TO.SampleQM') chltype(clussdr) conname('localhost(1414)') cluster(PLSRCLUS)
3 : def chl('TO.SampleQM') chltype(clussdr) conname('localhost(1414)') cluster(PLSRCLUS)
AMQ8014: IBM MQ channel created.
新規にパーシャル・リポジトリ―・キューマネージャーを作成/開始、リスナーを定義/開始します。 手動定義のクラスター送信側チャネルを1つ定義します。 2つのフル・リポジトリであるSampleQMとRemoteQMのどちらか一方へのクラスター送信側チャネルを手動定義します。 どちらでも構いませんが、ここでは、SampleQMへのチャネルを定義します。
$ crtmqm PartialQM
※MQ8 for HP NonStopの場合はGuardianでの8文字の制限がありますので、注意してください。
下記は、MQ8.0 for HP NonStopの場合の例
$ crtmqm -ng sas13.PARTIAL PartialQM
IBM MQ queue manager created.
....
$ strmqm PartialQM
IBM MQ queue manager 'PartialQM' starting.
IBM MQ queue manager 'PartialQM' started using V8.0.3.0.
$ runmqsc PartialQM
....
MQSC > def listener(listener) trptype(tcp) port(18553) control(qmgr)
1 : def listener(listener) trptype(tcp) port(18553) control(qmgr)
AMQ8626: IBM MQ listener created.
MQSC > sta listener(listener)
2 : sta listener(listener)
AMQ8021: Request to start IBM MQ listener accepted.
MQSC > dis lsstatus(listener) status
5 : dis lsstatus(listener) status
AMQ8631: Display listener status details.
LISTENER(LISTENER) STATUS(RUNNING)
....
MQSC > def chl('TO.SampleQM') chltype(clussdr) conname('localhost(1414)') cluster(PLSRCLUS)
3 : def chl('TO.SampleQM') chltype(clussdr) conname('localhost(1414)') cluster(PLSRCLUS)
AMQ8014: IBM MQ channel created.
各キュー・マネージャーでクラスターに参加している3つキューマネージャーがリストされることを確認してください。
MQSC > dis clusqmgr(*)
5 : dis clusqmgr(*)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(PartialQM) CHANNEL(TO.PartialQM)
CLUSTER(PLSRCLUS)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(RemoteQM) CHANNEL(TO.RemoteQM)
CLUSTER(PLSRCLUS)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(SampleQM) CHANNEL(TO.SampleQM)
CLUSTER(PLSRCLUS)
表示されない場合は、3つのキューマネージャー間の送受信チャネルが開始しているかどうかを確認してください("dis chs(*)")。 通常は自動的に開始されます。 もし、問題が継続する場合は、エラー・ログを確認して、問題を解決してください。 問題の解決の方法は製品マニュアルをご参照ください。
<< SampleQMとRemoteQMでの作業 >>
次にSampleQMとRemoteQMに同じ名前のクラスター・キューを作成します。
MQSC > def ql(CQ1) cluster(PLSRCLUS)
6 : def ql(CQ1) cluster(PLSRCLUS)
AMQ8006: IBM MQ queue created.
※両方で定義後、どちらのキューマネージャーからも、下記コマンドで定義したクラスター・キューがリストできるはずです。
MQSC > dis qc(*) CLUSQMGR
3 : dis qc(*) CLUSQMGR
AMQ8409: Display Queue details.
QUEUE(CQ1) TYPE(QCLUSTER)
CLUSQMGR(RemoteQM)
AMQ8409: Display Queue details.
QUEUE(CQ1) TYPE(QCLUSTER)
CLUSQMGR(SampleQM)
この時点では、パーシャル・リポジトリ―・キューマネージャーである、PartialQMからはクラスター・キューは見えません。 パーシャル・リポジトリ―・キューマネージャーから初めてクラスター・キューが使用された後にリストされるようになります。 これもよく誤解されますが、MQの仕様です。
Ex. 5.5 クラスター・キューへ書き込み時、グループ単位で宛先固定させる。
「Ex. 4.5 グループ化された論理メッセージの生成」と同様のファイルを使用して、PartialQMから先ほど作成したクラスター・キューにグループ化されたメッセージを作成して書き込みます。 この時、コマンドライン・オプションにMQOO_BIND_ON_GROUPを追加し、さらに"-n 3"を指定して3回同じ処理を繰り返して、3つのグループを書き込みます。メッセージの書き込み時に"-n"を指定した場合でも、mqpgfのMQOPEN()の呼び出しは1回のみです。
SampleQM、RemoteQMおよびPartialQMにそれぞれに一つずつ端末/コマンドプロンプトを用意します。
SampleQM上で、下記コマンドでメッセージの到着を待ちます。
※"-hex"を使用するとメッセージとヘッダの一部が16進表記で表示されます。
MQMDのフィールドではReportとMsgflagsが16進表記で表示されます。
(詳細はmqpgfユーザーズ・ガイドを参照してください。)
$ mqpgf -qm SampleQM -q CQ1 -dpv -hex -r MQGMO_WAIT MQWI_UNLIMITED MQGMO_NO_SYNCPOINT
*オプションの説明
-hex: 表示するデータとヘッダの一部を16進形式で表示する。
-r: (受信)処理を繰り返す。
MQGMO_WAIT: MQGMO.OptionsにMQGMO_WAITを設定
MQWI_UNLIMITED: MQGMO.WaitIntervalにMQWI_UNLIMITEDを設定
RemoteQMでも同様のコマンドでメッセージの到着を待ちます。
$ mqpgf -qm RemoteQM -q CQ1 -dpv -hex -r MQGMO_WAIT MQWI_UNLIMITED MQGMO_NO_SYNCPOINT
PartialQMで、先にご説明したコマンドで3つのグループを作成してクラスター・キュー(CQ1)へ書き込みます。
$ mqpgf -qm PartialQM -q CQ1 -f largemsg2.txt -dl 0x0a MQMD_VERSION_2 MQPMO_LOGICAL_ORDER MQOO_BIND_ON_GROUP -n 3
[18/06/19 15:23:30] 1: put from: largemsg2.txt
[18/06/19 15:23:30] 1: logical message: 1 length: 10 put message: 1234567890
[18/06/19 15:23:30] 1: logical message: 2 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 1: logical message: 3 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 1: logical message: 4 length: 36 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
[18/06/19 15:23:30] 1: logical message: 5 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 2: put from: largemsg2.txt
[18/06/19 15:23:30] 2: logical message: 1 length: 10 put message: 1234567890
[18/06/19 15:23:30] 2: logical message: 2 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 2: logical message: 3 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 2: logical message: 4 length: 36 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
[18/06/19 15:23:30] 2: logical message: 5 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 3: put from: largemsg2.txt
[18/06/19 15:23:30] 3: logical message: 1 length: 10 put message: 1234567890
[18/06/19 15:23:30] 3: logical message: 2 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 3: logical message: 3 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
[18/06/19 15:23:30] 3: logical message: 4 length: 36 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
[18/06/19 15:23:30] 3: logical message: 5 length: 62 put message: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz
3セットのグループ化されたメッセージが作成されます。
SampleQMとRemoteQMのクラスタ・キューの双方にメッセージが書き込まれ、それが取得されて次の様に表示されているはずです。
ワークロード・バランスの結果ですので、SampleQMとRemoteQMは逆になっているかもしれません。
テスト結果5.5.1
※SampleQMのクラスタ・キューに到着したメッセージのダンプ
message number: 1
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002868] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002869] MsgSeqNumber[1] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 10
00000000: 3132 3334 3536 3738 3930 '1234567890 '
message number: 2
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D82000286B] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002869] MsgSeqNumber[2] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 3
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D82000286D] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002869] MsgSeqNumber[3] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 4
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D82000286F] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002869] MsgSeqNumber[4] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 36
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 'WXYZ '
message number: 5
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002871] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002869] MsgSeqNumber[5] Offset[0] MsgFlags[0x00000018] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 6
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D82000287E] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D82000287F] MsgSeqNumber[1] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 10
00000000: 3132 3334 3536 3738 3930 '1234567890 '
message number: 7
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002881] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D82000287F] MsgSeqNumber[2] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 8
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002883] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D82000287F] MsgSeqNumber[3] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 9
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002885] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D82000287F] MsgSeqNumber[4] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 36
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 'WXYZ '
message number: 10
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002887] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D82000287F] MsgSeqNumber[5] Offset[0] MsgFlags[0x00000018] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
テスト結果5.5.2
※RemoteQMのクラスタ・キューに到着したメッセージのダンプ
message number: 1
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002873] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002874] MsgSeqNumber[1] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 10
00000000: 3132 3334 3536 3738 3930 '1234567890 '
message number: 2
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002876] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002874] MsgSeqNumber[2] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 3
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D820002878] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002874] MsgSeqNumber[3] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
message number: 4
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D82000287A] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002874] MsgSeqNumber[4] Offset[0] MsgFlags[0x00000008] OriginalLength[-1]
data length: 36
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 'WXYZ '
message number: 5
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2897D82000287C] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180619] PutTime[06233067] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2897D820002874] MsgSeqNumber[5] Offset[0] MsgFlags[0x00000018] OriginalLength[-1]
data length: 62
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
00000020: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000030: 6D6E 6F70 7172 7374 7576 7178 797A 'mnopqrstuvqxyz '
下記の3種類グループIDを持つメッセージがその単位でSapmleQMとRemoteQMに割り振られていることが確認できます。
SampleQM:
GroupId[0x414D51205061727469616C514D2020205B2897D820002869]
RemoteQM:
GroupId[0x414D51205061727469616C514D2020205B2897D82000287F]
GroupId[0x414D51205061727469616C514D2020205B2897D820002874]
これら3グループ全てのメッセージが一回のクラスター・キュー(CQ1)へのMQOPEN()で書き込まれていることに注意してください。 キューマネージャー毎にMQOPEN()を呼び出しているわけではありません。 MQOO_BIND_ON_OPEN、MQOO_BIND_NOT_FIXEDを指定した場合の挙動の違いも確認してみてください。
クラスター・キューとセグメント化
クラスタ・キューのMAXMSGLの設定値でセグメント化させる場合、メッセージをセグメント化させるのは、送信側キューマネージャーではなく、受信がキューマネージャーです。 セグメント化されたメッセージが送受信されるわけではないことに注意してください。 クラスタ・キューをホストする各キューマネージャーでMAXMSGLをセグメント化したい値に変更します。
Ex. 5.6 クラスター・キューでのセグメント化
実際にテストして確認してみます。
SampleQMとRemoteQMの両方のクラスターキューのMAXMSGLを40に設定します。
$ echo "alter ql(CQ1) maxmsgl(40)" | runmqsc SampleQM
$ echo "alter ql(CQ1) maxmsgl(40)" | runmqsc RemoteQM
※Windowsはセミコロンは不要です。
MQXMSGLとCURDEPTHを事前に確認しておきます。
$ mqpcf que -qm SampleQM -q CQ1 MAXMSGL CURDEPTH -t
[18/06/22 09:52:53] 1: QUEUE(CQ1) TYPE(QLOCAL) CURDEPTH(0) MAXMSGL(40)
$ mqpcf que -qm RemoteQM -q CQ1 MAXMSGL CURDEPTH -t
[18/06/22 09:52:59] 1: QUEUE(CQ1) TYPE(QLOCAL) CURDEPTH(0) MAXMSGL(40)
クラスター・チャネルはメッセージの送信時にも自動的に開始されますが、事前にチャネルステータスを確認する為に開始しておきます。
$ mqpcf sta -qm PartialQM -c TO.SampleQM
MQExecute : Command Server Error. mqExecuteCC=[2], mqExecuteRC=[3008], mqCommandCC=[2], mqCommandRC=[4031]
MQExecute : Command Server Error. mqExecuteCC=[2], mqExecuteRC=[3008], mqCommandCC=[2], mqCommandRC=[3008]
$ mqrc 4031
4031 0x00000fbf MQRCCF_CHANNEL_IN_USE
※既にチャネルが開始していた場合は、上記理由コードで失敗します。
$ mqpcf sta -qm PartialQM -c TO.RemoteQM
Channel Start Success. Channel Name : TO.RemoteQM
PartialQM側の2つの送信側チャネル、TO.SampleQMとTO.RemoteQMのCURSEQNO、MSGSを確認します。
$ mqpcf chs -qm PartialQM -c TO.* CURSEQNO MSGS -t
[18/06/22 10:01:09] 1: CHLINSTYPE(CURRENT) CHANNEL(TO.SampleQM) STATUS(RUNNING) CHLTYPE(CLUSSDR) CONNAME(10.41.207.3(1414)) RQMNAME(SampleQM) STOPREQ(NO) SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE) CURSEQNO(9) MSGS(1)
[18/06/22 10:01:09] 2: CHLINSTYPE(CURRENT) CHANNEL(TO.RemoteQM) STATUS(RUNNING) CHLTYPE(CLUSSDR) CONNAME(10.41.207.3(1415)) RQMNAME(RemoteQM) STOPREQ(NO) SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE) CURSEQNO(8) MSGS(0)
....
※MSGSとCURSEQNOの意味は下記です。
MSGS: | チャネルが開始後に送信または受信されたメッセージの数 |
CURSEQNO: | 最後に送受信したメッセージの順序番号 |
MQMF_SEGMENTATION_ALLOWEDを指定してPartialQMからメッセージをPUTします。
$ mqpgf -qm PartialQM -q CQ1 -f largemsg.txt MQMF_SEGMENTATION_ALLOWED MQMD_VERSION_2
[18/06/22 10:01:56] 1: put from: largemsg.txt
CQ1をホストするキューマネージャーでCURDEPTHを確認します。
テスト結果5.6.1
$ mqpcf que -qm SampleQM -q CQ1 CURDEPTH -t
[18/06/22 10:02:08] 1: QUEUE(CQ1) TYPE(QLOCAL) CURDEPTH(0)
$ mqpcf que -qm RemoteQM -q CQ1 CURDEPTH -t
[18/06/22 10:02:15] 1: QUEUE(CQ1) TYPE(QLOCAL) CURDEPTH(10)
※RemoteQM側が10件に変わっています。
CURSEQNO、MSGSがどう変化したか確認します。
テスト結果5.6.2
$ mqpcf chs -qm PartialQM -c TO.* CURSEQNO MSGS -t
[18/06/22 10:02:33] 1: CHLINSTYPE(CURRENT) CHANNEL(TO.SampleQM) STATUS(RUNNING) CHLTYPE(CLUSSDR) CONNAME(xxx.xxx.xxx.xxx(xxxx)) RQMNAME(SampleQM) STOPREQ(NO) SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE) CURSEQNO(9) MSGS(1)
[18/06/22 10:02:33] 2: CHLINSTYPE(CURRENT) CHANNEL(TO.RemoteQM) STATUS(RUNNING) CHLTYPE(CLUSSDR) CONNAME(xxx.xxx.xxx.xxx(xxxx)) RQMNAME(RemoteQM) STOPREQ(NO) SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE) CURSEQNO(9) MSGS(1)
....
※TO.RemoteQMがCURSEQNO:8->9、MSGS:0->1に1づつ増加しています。 これは伝送されたメッセージは1件のみであることを示しています。 そして、CURDEPTHが10件になっているのは、受信チャネルのMCA(メッセージ・チャネル・エージェント)が受信キュー(CQ1)に書き込んだ時に受信側のキューマネージャーによってセグメント化されたことを示しています。
RemoteQMのクラスターキューをダンプして確認します。
テスト結果5.6.3
$ mqpgf -qm RemoteQM -q CQ1 -dpv -r -hex
message number: 1
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B2C448020002A0B] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[0] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
00000010: 4748 494A 4B4C 4D4E 4F50 5152 5354 5556 'GHIJKLMNOPQRSTUV'
message number: 2
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002902] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[32] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 5758 595A 6162 6364 6566 6768 696A 6B6C 'WXYZabcdefghijkl'
00000010: 6D6E 6F70 7172 7374 7576 7178 797A 0A31 'mnopqrstuvqxyz.1'
message number: 3
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002903] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[64] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 3233 3435 3637 3839 3041 4243 4445 4647 '234567890ABCDEFG'
00000010: 4849 4A4B 4C4D 4E4F 5051 5253 5455 5657 'HIJKLMNOPQRSTUVW'
message number: 4
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002904] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[96] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 5859 5A61 6263 6465 6667 6869 6A6B 6C6D 'XYZabcdefghijklm'
00000010: 6E6F 7071 7273 7475 7671 7879 7A0A 3132 'nopqrstuvqxyz.12'
message number: 5
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002905] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[128] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 3334 3536 3738 3930 4142 4344 4546 4748 '34567890ABCDEFGH'
00000010: 494A 4B4C 4D4E 4F50 5152 5354 5556 5758 'IJKLMNOPQRSTUVWX'
message number: 6
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002906] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[160] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 595A 6162 6364 6566 6768 696A 6B6C 6D6E 'YZabcdefghijklmn'
00000010: 6F70 7172 7374 7576 7178 797A 0A31 3233 'opqrstuvqxyz.123'
message number: 7
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002907] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[192] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 3435 3637 3839 3041 4243 4445 4647 4849 '4567890ABCDEFGHI'
00000010: 4A4B 4C4D 4E4F 5051 5253 5455 5657 5859 'JKLMNOPQRSTUVWXY'
message number: 8
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002908] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[224] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 5A61 6263 6465 6667 6869 6A6B 6C6D 6E6F 'Zabcdefghijklmno'
00000010: 7071 7273 7475 7671 7879 7A0A 3132 3334 'pqrstuvqxyz.1234'
message number: 9
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C20002909] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[256] MsgFlags[0x00000003] OriginalLength[32]
data length: 32
00000000: 3536 3738 3930 4142 4344 4546 4748 494A '567890ABCDEFGHIJ'
00000010: 4B4C 4D4E 4F50 5152 5354 5556 5758 595A 'KLMNOPQRSTUVWXYZ'
message number: 10
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D512052656D6F7465514D202020205B2C445C2000290A] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180622] PutTime[01015632] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B2C448020002A0C] MsgSeqNumber[1] Offset[288] MsgFlags[0x00000007] OriginalLength[27]
data length: 27
00000000: 6162 6364 6566 6768 696A 6B6C 6D6E 6F70 'abcdefghijklmnop'
00000010: 7172 7374 7576 7178 797A 0A 'qrstuvqxyz. '
no message available : CQ1 CompCd=02 ReasonCd=2033
セグメント化されていることの確認方法は既にご説明済みですので、省略します。
テスト終了後は、MAXMSGLを戻しておきます。
$ echo "alter ql(CQ1) maxmsgl(4194304)" | runmqsc SampleQM
$ echo "alter ql(CQ1) maxmsgl(4194304)" | runmqsc RemoteQM
送信側キューマネージャーでのセグメント化
なんらかの理由で送信側でセグメント化し、その宛先も固定したい場合は、キューマネージャーのMAXMSGLでセグメント化を行わせる方法が使用できます。 この場合、単独のメッセージをセグメント化する場合でも、グループ化されたメッセージと組み合わされた場合でも、MQOO_BIND_ON_GROUPの機能は有効になります。
Ex. 5.7 送信側キューマネージャーでのセグメント化と宛先の固定
グループに属さない、単独のメッセージでキューマネージャーにセグメント化させて確認してみます。 キューマネージャー・プロパティのMAXMSGLは設定できる最小値の32768にします。
$ mqpcf qmgr -qm PartialQM MAXMSGL
1: QMNAME(PartialQM) MAXMSGL(32768)
長さを50000に固定して3回同じファイルをクラスター・キューへ書き込みます。 MQOPEN()の呼び出しは1回です。
$ mqpgf -qm PartialQM -q CQ1 -f largemsg.txt -l 50000 MQMF_SEGMENTATION_ALLOWED MQMD_VERSION_2 MQOO_BIND_ON_GROUP -n 3
[18/06/20 11:30:09] 1: put from: largemsg.txt
[18/06/20 11:30:09] 2: put from: largemsg.txt
[18/06/20 11:30:09] 3: put from: largemsg.txt
*オプションの説明
-l: データの長さを指定したサイズに強制します。
MQMF_SEGMENTATION_ALLOWED: MQMD.MsgFlagsにMQMF_SEGMENTATION_ALLOWEDを設定
MQMD_VERSION_2: MQMD.VersionにMQMD_VERSION_2を設定
MQOO_BIND_ON_GROUP: MQOPENのOptionsにMQOO_BIND_ON_GROUPを設定
-n: 3回処理を繰り返します。
SampleQMとRemoteQMのクラスター・キューへ到着したメッセージを確認します。
まず、SampleQMのCQ1をダンプしてみます。
テスト結果5.7.1
$ mqpgf -qm SampleQM -q CQ1 -dpv -r -hex MQGMO_ACCEPT_TRUNCATED_MSG
MQGET with warning : CQ1 CompCd=01 ReasonCd=2079 len=32256
message number: 1
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B299F5020002D02] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180620] PutTime[02300923] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B299F5020002D03] MsgSeqNumber[1] Offset[0] MsgFlags[0x00000003] OriginalLength[32256]
data length: 32256
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
....
MQGET with warning : CQ1 CompCd=01 ReasonCd=2079 len=17744
message number: 2
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B299F5020002D05] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180620] PutTime[02300923] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B299F5020002D03] MsgSeqNumber[1] Offset[32256] MsgFlags[0x00000007] OriginalLength[17744]
data length: 17744
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 '................'
....
MQGET with warning : CQ1 CompCd=01 ReasonCd=2079 len=32256
message number: 3
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B299F5020002D0C] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180620] PutTime[02300924] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B299F5020002D0D] MsgSeqNumber[1] Offset[0] MsgFlags[0x00000003] OriginalLength[32256]
data length: 32256
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
....
MQGET with warning : CQ1 CompCd=01 ReasonCd=2079 len=17744
message number: 4
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B299F5020002D0F] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180620] PutTime[02300924] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B299F5020002D0D] MsgSeqNumber[1] Offset[32256] MsgFlags[0x00000007] OriginalLength[17744]
data length: 17744
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 '................'
....
no message available : CQ1 CompCd=02 ReasonCd=2033
次に、RemoteQMのCQ1をダンプします。
テスト結果5.7.2
$ mqpgf -qm RemoteQM -q CQ1 -dpv -r -hex MQGMO_ACCEPT_TRUNCATED_MSG
MQGET with warning : CQ1 CompCd=01 ReasonCd=2079 len=32256
message number: 1
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B299F5020002D07] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180620] PutTime[02300924] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B299F5020002D08] MsgSeqNumber[1] Offset[0] MsgFlags[0x00000003] OriginalLength[32256]
data length: 32256
00000000: 3132 3334 3536 3738 3930 4142 4344 4546 '1234567890ABCDEF'
....
MQGET with warning : CQ1 CompCd=01 ReasonCd=2079 len=17744
message number: 2
*StrucId[MD ] Version[2] Report[0x00000000] MsgType[8] Expiry[-1] Feedback[0] Encoding[273] CodedCharSetId[819] Format[ ] Priority[0] Persistence[0] MsgId[0x414D51205061727469616C514D2020205B299F5020002D0A] CorrelId[0x000000000000000000000000000000000000000000000000] BackoutCount[0] ReplyToQ[ ] ReplyToQMgr[PartialQM ] UserIdentifier[mqm ] AccountingToken[0x0534343033310000000000000000000000000000000000000000000000000006] ApplIdentityData[ ] PutApplType[13] PutApplName[mqpgf ] PutDate[20180620] PutTime[02300924] ApplOriginData[ ]
GroupId[0x414D51205061727469616C514D2020205B299F5020002D08] MsgSeqNumber[1] Offset[32256] MsgFlags[0x00000007] OriginalLength[17744]
data length: 17744
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 '................'
....
no message available : CQ1 CompCd=02 ReasonCd=2033
単独のメッセージをセグメント化する場合にもユニークなGroupIdが採番されますが、そのGroupId毎にワークロード・バランシングされていることが確認できます。
※「IBM MQ 8.0.3.0 for HP NonStop」や「IBM MQ 9.0.3.0 for Windows」での検証ではアプリケーションでセグメンテーションを行った場合は、MQOO_BIND_ON_GROUPは有効になりません。グループの一部である論理メッセージに対してアプリケーションでセグメンテーションした場合も同様です。また、グループ化やセグメント化されたメッセージをアプリケーションで中継する場合もMQOO_BIND_ON_GROUPの効果はありません。
最後にワークロード管理アルゴリズムが実行されるタイミングについて整理しておきます。
MQOO_BIND_ON_OPEN: | クラスター・キューが開かれた時 |
MQOO_BIND_NOT_FIXED: | メッセージがクラスター・キューに書き込まれた時 |
MQOO_BIND_ON_GROUP: | 新規にメッセージ・グループが開始された時 |
これで、MQMDについての説明は終わりです。 次回からは、新しいテーマで連載を続けます。