2.5.1 JMSメッセージの構成
Reliable Messagingは,JMSメッセージを送受信することでアプリケーション連携します。JMSメッセージは,ヘッダ,プロパティおよびペイロードの三つの要素で構成されます。
JMSメッセージの構成を次の図に示します。
(1) JMSメッセージのヘッダ
JMSメッセージのヘッダは,アプリケーションやシステムに,メッセージのあて先や識別子などの制御情報を提供するためのフィールドです。
ヘッダの一覧を次の表に示します。
ヘッダの設定タイミングと取得タイミングを次の表に示します。
項番 |
ヘッダ |
設定タイミング |
取得タイミング※ |
---|---|---|---|
1 |
JMSDestination |
QueueSession.createSender(Queue queue)メソッド発行時に,指定したキューの名前が設定されます。 Message.setJMSDestination()メソッドでこのヘッダを設定できません。 |
メッセージ送信完了後に取得できます。 |
2 |
JMSDeliveryMode |
メッセージ送信時にReliable Messagingがhrmmkqueコマンドの-mオプション指定値に従って設定します。 Message.setJMSDeliveryMode()メソッドでこのヘッダを設定できません。 |
メッセージ受信後に取得できます。 |
3 |
JMSMessageID |
メッセージ送信時にReliable Messagingが設定します。また,デッドメッセージ再登録時にReliable Messagingが再設定します。 Message.setJMSMessageID()メソッドでこのヘッダを設定できません。 |
メッセージ送信完了後に取得できます。 |
4 |
JMSTimestamp |
メッセージ送信時にReliable Messagingが設定します。また,デッドメッセージ再登録時にReliable Messagingが再設定します。 Message.setJMSTimestamp()メソッドでこのヘッダを設定できません。 |
メッセージ送信完了後に取得できます。 |
5 |
JMSExpiration |
送信側と受信側で,設定のタイミングが異なります。 送信側の場合,メッセージ送信時にReliable Messagingがキュー属性(メッセージ有効期間)に従って設定します。また,デッドメッセージの再登録時にReliable Messagingが登録するキューの属性(メッセージ有効期間)に従って再設定します。 キュー間転送を実施する場合,受信側では,受信側ローカルキューの属性の設定によって次のように異なります。
なお,MessageインタフェースのsetJMSExpirationメソッドでは,このヘッダの値を設定できません。setJMSExpirationメソッドの詳細については「7.4.4 Messageインタフェース」を参照してください。 |
メッセージ送信完了後に取得できます。 |
6 |
JMSRedelivered |
メッセージをアプリケーションに配送したが,リカバーされたなどでもう一度配送する必要があるときにtrueに設定されます。 Message.setJMSRedelivered()メソッドでこのヘッダを設定できません。 Reliable Messagingを再度開始すると,falseに設定されます。 |
メッセージ受信後に取得できます。 |
7 |
JMSPriority |
QueueSender.setPriority()メソッドまたはQueueSender.send()メソッドで指定したpriorityの値が設定されます。両方のメソッドでpriorityが指定されている場合は,QueueSender.send()メソッドで指定した値が優先されます。 Message.setJMSPriority()メソッドでこのヘッダを設定できません。 |
メッセージ送信完了後に取得できます。 |
8 |
JMSReplyTo |
Message.setJMSReplyTo()メソッド発行時に,指定値が設定されます。設定は任意です。 受信側からのメッセージ返信を必要とする場合,送信側のユーザがこのヘッダにあて先を設定します。 |
設定タイミング後に取得できます。 |
9 |
JMSCorrelationID |
Message.setJMSCorrelationID()メソッド発行時に,指定値が設定されます。設定は任意です。 |
設定タイミング後に取得できます。 |
10 |
JMSType |
Message.setJMSType()メソッド発行時に,指定値が設定されます。設定は任意です。 |
設定タイミング後に取得できます。 |
ObjectMessage(ペイロードにBytesContainerを含む)を送受信した場合のヘッダの設定タイミングと取得タイミングを次の表に示します。
項番 |
ヘッダ |
設定タイミング |
取得タイミング※ |
---|---|---|---|
1 |
JMSDestination |
QueueSession.createSender(Queue queue)メソッド発行時に,指定したキューの名前が設定されます。 Message.setJMSDestination()メソッドでこのヘッダを設定できません。 |
送信側ではメッセージ送信完了後に取得できます。受信側では取得できません。 |
2 |
JMSDeliveryMode |
メッセージ送信時にReliable Messagingがhrmmkqueコマンドの-mオプション指定値に従って設定します。 Message.setJMSDeliveryMode()メソッドでこのヘッダを設定できません。 |
メッセージ受信後に取得できます。 |
3 |
JMSMessageID |
メッセージ送信時にReliable Messagingが設定します。また,デッドメッセージ再登録時にReliable Messagingが再設定します。 Message.setJMSMessageID()メソッドでこのヘッダを設定できません。 |
送信側ではメッセージ送信完了後に取得できます。受信側では取得できません。 |
4 |
JMSTimestamp |
メッセージ送信時にReliable Messagingが設定します。また,デッドメッセージ再登録時にReliable Messagingが再設定します。 Message.setJMSTimestamp()メソッドでこのヘッダを設定できません。 |
送信側ではメッセージ送信完了後に取得できます。受信側では取得できません。 |
5 |
JMSExpiration |
送信側ではメッセージ送信時にReliable Messagingがキュー属性(メッセージ有効期間)に従って設定します。ローカルキュー送信の場合も同様です。また,デッドメッセージの再登録時にReliable Messagingが登録するキューの属性(メッセージ有効期間)に従って再設定します。 キュー間転送を実施した場合,受信側では,受信側ローカルキューの属性の設定によって次のように異なります。
|
キュー間転送の場合,送信側ではメッセージ送信完了後に取得できます。受信側では別の値が取得できます。 |
6 |
JMSRedelivered |
メッセージをアプリケーションに配送したが,リカバーされたなどでもう一度配送する必要があるときにtrueに設定されます。 Message.setJMSRedelivered()メソッドでこのヘッダを設定できません。 Reliable Messagingを再度開始すると,falseに設定されます。 |
メッセージ受信後に取得できます。 |
7 |
JMSPriority |
送信側ではQueueSender.setPriority()メソッドまたはQueueSender.send()メソッドで指定したpriorityの値が設定されます。両方のメソッドでpriorityが指定されている場合は,QueueSender.send()メソッドで指定した値が優先されます。 キュー間転送を実施した場合,受信側で受信メッセージが永続される前に,デフォルト値が設定されます。 Message.setJMSPriority()メソッドでこのヘッダを設定できません。 |
キュー間転送の場合,送信側ではメッセージ送信完了後に取得できます。受信側では別の値が取得できます。 |
8 |
JMSReplyTo |
Message.setJMSReplyTo()メソッド発行時に,指定値が設定されます。設定は任意です。 受信側からのメッセージ返信を必要とする場合,送信側のユーザがこのヘッダにあて先を設定します。 |
送信側では設定タイミング後に取得できます。受信側では取得できません。 |
9 |
JMSCorrelationID |
Message.setJMSCorrelationID()メソッド発行時に,指定値が設定されます。設定は任意です。 |
送信側では設定タイミング後に取得できます。受信側では取得できません。 |
10 |
JMSType |
Message.setJMSType()メソッド発行時に,指定値が設定されます。設定は任意です。 |
送信側では設定タイミング後に取得できます。受信側では取得できません。 |
(2) JMSメッセージのプロパティ
JMSメッセージのプロパティは,ヘッダに追加する制御情報が格納されたフィールドです。次に示す種類があります。
-
JMS定義のプロパティ
JMSが定義するプロパティです。これらのプロパティの完全なセットは,JMS仕様で定義されています。
半角英字だけで定義され,大文字と小文字は区別されます。
-
Reliable Messaging固有のプロパティ
Reliable Messagingが独自に提供するプロパティです。
半角英字だけで定義され,大文字と小文字は区別されます。
-
アプリケーション指定のプロパティ
ユーザが必要に応じて定義するプロパティです。ただし,使用できるプロパティ名には制限があります。
プロパティ名には半角および全角を使用できます。また,大文字と小文字は区別されます。
(a) JMS定義のプロパティ
JMS定義のプロパティの一覧を次の表に示します。
JMS定義のプロパティの設定タイミングと取得タイミングを次の表に示します。
項番 |
プロパティ |
設定タイミング |
取得タイミング |
---|---|---|---|
1 |
JMSXUserID |
− |
− |
2 |
JMSXAppID |
− |
− |
3 |
JMSXConsumerTXID |
− |
− |
4 |
JMSXProducerTXID |
− |
− |
5 |
JMSXRcvTimestamp |
メッセージをコンシューマに配送した際に,Reliable Messagingが設定します。 |
メッセージ受信後に取得できます。 |
6 |
JMSXDeliveryCount |
メッセージ承認時にReliable Messagingが設定します。Reliable Messagingを再度開始すると,この値は0に設定されます。 |
メッセージ受信後に取得できます。 |
7 |
JMSXState |
− |
− |
8 |
JMSXGroupID |
Message.setStringProperty("JMSXGroupID", groupID)またはsetObjectProperty("JMSXGroupID", groupID)メソッド発行時に,指定したgroupIDの値が設定されます。設定は任意です。ユーザが設定できる文字数は半角全角を問わないで512文字以下です。 |
設定タイミング後に取得できます。 |
9 |
JMSXGroupSeq |
Message.setIntProperty("JMSXGroupSeq", seq)メソッド発行時に,指定したseqの値が設定されます。設定は任意です。 ユーザが設定できる値は0以上です。 |
設定タイミング後に取得できます。 |
また,ObjectMessage(ペイロードにBytesContainerを含む)を送受信した場合のJMS定義のプロパティの設定タイミングと取得タイミングを次の表に示します。
項番 |
プロパティ |
設定タイミング |
取得タイミング |
---|---|---|---|
1 |
JMSXUserID |
− |
− |
2 |
JMSXAppID |
− |
− |
3 |
JMSXConsumerTXID |
− |
− |
4 |
JMSXProducerTXID |
− |
− |
5 |
JMSXRcvTimestamp |
メッセージをコンシューマに配送した際に,Reliable Messagingが設定します。 |
メッセージ受信後に取得できます。 |
6 |
JMSXDeliveryCount |
メッセージ承認時にReliable Messagingが設定します。Reliable Messagingを再度開始すると,この値は0に設定されます。 |
メッセージ受信後に取得できます。 |
7 |
JMSXState |
− |
− |
8 |
JMSXGroupID |
Message.setStringProperty("JMSXGroupID", groupID)またはsetObjectProperty("JMSXGroupID", groupID)メソッド発行時に,指定したgroupIDの値が設定されます。設定は任意です。ユーザが設定できる文字数は半角全角を問わないで512文字以下です。 |
送信側では設定タイミング後に取得できます。受信側では取得できません。 |
9 |
JMSXGroupSeq |
Message.setIntProperty("JMSXGroupSeq", seq)メソッド発行時に,指定したseqの値が設定されます。設定は任意です。 ユーザが設定できる値は0以上です。 |
送信側では設定タイミング後に取得できます。受信側では取得できません。 |
(b) Reliable Messaging固有のプロパティ
Reliable Messaging固有のプロパティの一覧を次の表に示します。
項番 |
文字列 |
説明 |
---|---|---|
1 |
メッセージが有効期限に達しました。 |
|
2 |
メッセージの配送回数が最大値に達しました。 |
|
3 |
順序制御のために滞留しているメッセージが有効期限に達しました。または,滞留しているメッセージの属しているグループが閉鎖しました。 |
|
4 |
メッセージの受信に失敗した通知を受け取りました。 |
Reliable Messaging固有のプロパティ固有のプロパティの設定タイミングと取得タイミングを次の表に示します。
項番 |
プロパティ |
設定タイミング |
取得タイミング |
---|---|---|---|
1 |
JMS_HITACHI_DeadMessageTimestamp |
メッセージがデッドメッセージキューに保存される際に,Reliable Messagingが設定します。 なお,デッドメッセージが再登録される際に削除します。 |
デッドメッセージキューからメッセージを受信したあとで取得できます。 |
2 |
JMS_HITACHI_DeadMessageCause |
メッセージがデッドメッセージキューに保存される際に,Reliable Messagingが設定します。 なお,デッドメッセージが再登録される際に削除します。 |
デッドメッセージキューからメッセージを受信したあとで取得できます。 |
3 |
JMS_HITACHI_DeadMessageOriginalQueueName |
メッセージがデッドメッセージキューに保存される際に,Reliable Messagingが設定します。 なお,デッドメッセージが再登録される際に削除します。 |
デッドメッセージキューからメッセージを受信したあとで取得できます。 |
4 |
JMS_HITACHI_DeadMessageID |
メッセージがデッドメッセージキューに保存される際に,Reliable Messagingが設定します。なお,デッドメッセージが再登録される際に削除します。 |
デッドメッセージキューからメッセージを受信したあとで取得できます。 |
5 |
JMS_HITACHI_UnitID |
ユーザがMessage.setStringProperty("JMS_HITACHI_UnitID", unitID)メソッド発行時に,指定したunitIDの値が設定されます。設定は任意です。ユーザが設定できる文字数は半角全角を問わないで512文字以下です。 |
設定タイミング後に取得できます。 |
(c) アプリケーション指定のプロパティ
ユーザが必要に応じて定義するプロパティです。
ユーザは,メッセージインタフェースのset<型名>Property()メソッドのname引数に任意のプロパティ名を指定してプロパティに値を設定します。get<型名>Property()メソッドのname引数にsetメソッドと同じ名前を指定してプロパティから値を取得します。
プロパティ名はユーザの実装に依存します。ただし,次に示す名前は使用できません。
(d) プロパティの型変換
Reliable Messaging固有のプロパティとアプリケーション指定のプロパティに設定できる型は,boolean,byte,short,int,long,float,doubleおよびStringです。書き込まれたときと異なる型でプロパティを読み取る場合,型は変換されます。
プロパティの型変換を次の表に示します。
書き込み時の型 |
読み取り時の型 |
|||||||
---|---|---|---|---|---|---|---|---|
boolean |
byte |
short |
int |
long |
float |
double |
String |
|
boolean |
○ |
○ |
||||||
byte |
○ |
○ |
○ |
○ |
○ |
|||
short |
○ |
○ |
○ |
○ |
||||
int |
○ |
○ |
○ |
|||||
long |
○ |
○ |
||||||
float |
○ |
○ |
○ |
|||||
double |
○ |
○ |
||||||
String |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
(3) JMSメッセージのペイロード
JMSメッセージのペイロードは,メッセージ本体のフィールドです。
Reliable Messagingは,次に示すメッセージインタフェースを提供します。各メッセージインタフェースのペイロードを次の表に示します。
項番 |
インタフェース名 |
ペイロードの説明 |
---|---|---|
1 |
Message |
ペイロードがありません。 |
2 |
BytesMessage |
ペイロードがプリミティブなバイトの配列です。 |
3 |
ObjectMessage※ |
ペイロードがシリアライズできるJavaオブジェクトです(BytesContainerおよびユーザが定義したクラスのオブジェクトを格納できます)。 |
4 |
TextMessage |
ペイロードがjava.lang.String型です。 |
(a) ObjectMessageのペイロードにBytesContainerを格納する場合
永続版リソースアダプタの場合,ObjectMessageオブジェクトのsetObjectメソッドの引数にBytesContainerオブジェクトを指定することで,BytesContainerを含むObjectMessageを送信できます。詳細は「7.7 転送データ相互接続用インタフェースの使い方」を参照してください。
(b) ObjectMessageのペイロードにユーザが定義したクラスのオブジェクトを格納する場合
ObjectMessageのペイロードにユーザが定義したクラスのオブジェクトを格納する場合は,送受信するアプリケーションにユーザが定義したクラスを含める必要があります。アプリケーションにユーザが定義したクラスを含めない場合は,Application ServerのJ2EEサーバ用オプション定義ファイルにユーザが定義したクラスまたはクラスが含まれるJARのクラスパスを,コンテナ拡張ライブラリとして指定する必要があります。
これらの設定や指定をしていない場合,取り出したメッセージからペイロードを取得するときに例外が発生します。ペイロードの取得で例外が発生した場合でも,取り出したメッセージのトランザクションが決着すると,メッセージが配信済みになるので注意してください。
また,Reliable Messaging 01-02以前でキューに登録したメッセージを移行した場合や,Reliable Messaging 01-02以前とキュー間転送する場合も,Application ServerのJ2EEサーバ用オプション定義ファイルにユーザが定義したクラスまたはクラスが含まれるJARのクラスパスを,コンテナ拡張ライブラリとして指定する必要があります。
Application ServerのJ2EEサーバ用オプション定義ファイル(usrconf.cfg)は,次に示す場所に格納されています。
<Application Serverのインストールディレクトリ>\CC\server\usrconf\ejb\<サーバ名>\usrconf.cfg
usrconf.cfgファイルをテキストエディタで開き,次の行を追加します。
add.class.path=<コンテナ拡張ライブラリ用のclassまたはJARのクラスパス>
J2EEサーバ用オプション定義ファイルについては,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。