2.5.1 JMSメッセージの構成

Cosminexus RMは,JMSメッセージを送受信することでアプリケーション連携します。JMSメッセージは,ヘッダ,プロパティおよびペイロードの三つの要素で構成されます。

JMSメッセージの構成について,次の図に示します。

図2-24 JMSメッセージの構成

[図データ]

<この項の構成>
(1) JMSメッセージのヘッダ
(2) JMSメッセージのプロパティ
(3) JMSメッセージのペイロード

(1) JMSメッセージのヘッダ

JMSメッセージのヘッダは,アプリケーションやシステムに,メッセージのあて先や識別子などの制御情報を提供するためのフィールドです。

ヘッダの一覧について,次の表に示します。

表2-6 ヘッダの一覧

項番ヘッダ説明
1JMSDestinationjavax.jms.Destinationメッセージが送信されるあて先です。
2JMSDeliveryModeintメッセージの永続性を示す値です。
3JMSMessageIDjava.lang.Stringプロバイダによって送信される各メッセージを一意に識別するメッセージ識別子です。このヘッダの値はRMSystemNameプロパティ指定値と現在時刻および通番によって構成されます。
RMSystemNameプロパティ指定値によって,JMSMessageIDの一意性は,Cosminexus RMをわたります。
4JMSTimestamplongメッセージの送信時刻を表す値(単位:ミリ秒)です。値はミリ秒で測定した現在時刻と協定世界時のUTC1970年1月1日午前0時との差です。
なお,メッセージのトランザクションやそのほかの受信側のキューイングによって実際の送信はあとから行われるため,メッセージが実際に送信された時刻ではありません。
5JMSExpirationlongメッセージの有効期間となる時刻を表す値(単位:ミリ秒)です。値はミリ秒で測定した現在時刻と協定世界時のUTC1970年1月1日午前0時との差です。
このヘッダの値はhrmmkqueコマンドの-eオプション指定値を基に決定されます。
6JMSRedeliveredbooleanメッセージが再配送中であるかどうかを示す値です。値がtrueのとき,メッセージが再配送中であることを示します。
7JMSPriorityintメッセージのプライオリティです。JMSはいちばん低い優先度の0からいちばん高い優先度の9まで,10のレベルのプライオリティを定義しています。
8JMSReplyTojavax.jms.Destination応答先のあて先です。このヘッダが設定されたメッセージを受信したアプリケーションが,該当するあて先へメッセージを送信するかどうかは任意です。
9JMSCorrelationIDjava.lang.Stringあるメッセージをほかのメッセージと関連づけるための相関識別子です。一般的には,応答メッセージをその要求メッセージと関連づけるために参照されます。
10JMSTypejava.lang.Stringメッセージが送信されるときに,アプリケーションによって提供されるメッセージタイプです。

ヘッダの設定タイミングと取得タイミングについて,次の表に示します。

表2-7 ヘッダの設定タイミングと取得タイミング

項番ヘッダ設定タイミング取得タイミング
1JMSDestinationQueueSession.createSender(Queue queue)メソッド発行時に,指定したキューの名前が設定されます。
Message.setJMSDestination()メソッドでこのヘッダを設定できません。
メッセージ送信完了後に取得できます。
2JMSDeliveryModeメッセージ送信時にCosminexus RMがhrmmkqueコマンドの-mオプション指定値に従って設定します。
Message.setJMSDeliveryMode()メソッドでこのヘッダを設定できません。
メッセージ受信後に取得できます。
3JMSMessageIDメッセージ送信時にCosminexus RMが設定します。また,デッドメッセージ再登録時にCosminexus RMが再設定します。
Message.setJMSMessageID()メソッドでこのヘッダを設定できません。
メッセージ送信完了後に取得できます。
4JMSTimestampメッセージ送信時にCosminexus RMが設定します。また,デッドメッセージ再登録時にCosminexus RMが再設定します。
Message.setJMSTimestamp()メソッドでこのヘッダを設定できません。
メッセージ送信完了後に取得できます。
5JMSExpiration送信側と受信側で,設定のタイミングが異なります。
送信側の場合,メッセージ送信時にCosminexus RMがキュー属性(メッセージ有効期間)に従って設定します。また,デッドメッセージの再登録時にCosminexus RMが登録するキューの属性(メッセージ有効期間)に従って再設定します。
キュー間転送を実施する場合,受信側では,受信側ローカルキューの属性の設定によって次のように異なります。
  • メッセージ有効期間の選択が受信側となっている場合は,受信側のキュー属性(メッセージ有効期間)に従って再設定されます。
  • メッセージ有効期間の選択が送信側となっている場合は,送信側で設定された値となり,受信側では再設定しません。
なお,MessageインタフェースのsetJMSExpirationメソッドでは,このヘッダの値を設定できません。setJMSExpirationメソッドの詳細については「7.4.4 Messageインタフェース」を参照してください。
メッセージ送信完了後に取得できます。
6JMSRedeliveredメッセージをアプリケーションに配送したが,リカバーされたなどでもう一度配送する必要があるときにtrueに設定されます。
Message.setJMSRedelivered()メソッドでこのヘッダを設定できません。
Cosminexus RMを再度開始すると,falseに設定されます。
メッセージ受信後に取得できます。
7JMSPriorityQueueSender.setPriority()メソッドまたはQueueSender.send()メソッドで指定したpriorityの値が設定されます。両方のメソッドでpriorityが指定されている場合は,QueueSender.send()メソッドで指定した値が優先されます。
Message.setJMSPriority()メソッドでこのヘッダを設定できません。
メッセージ送信完了後に取得できます。
8JMSReplyToMessage.setJMSReplyTo()メソッド発行時に,指定値が設定されます。設定は任意です。
受信側からのメッセージ返信を必要とする場合,送信側のユーザがこのヘッダにあて先を設定します。
設定タイミング後に取得できます。
9JMSCorrelationIDMessage.setJMSCorrelationID()メソッド発行時に,指定値が設定されます。設定は任意です。設定タイミング後に取得できます。
10JMSTypeMessage.setJMSType()メソッド発行時に,指定値が設定されます。設定は任意です。設定タイミング後に取得できます。
注※
表中に示したタイミング以外でヘッダの値を取得した場合,ヘッダが設定されていないときの値が返されます。詳細については,「7.4.4 Messageインタフェース」を参照してください。

ObjectMessage(ペイロードにBytesContainerを含む)を送受信した場合のヘッダの設定タイミングと取得タイミングについて,次の表に示します。

表2-8 ObjectMessage(ペイロードにBytesContainerを含む)を送受信した場合のヘッダの設定タイミングと取得タイミング

項番ヘッダ設定タイミング取得タイミング
1JMSDestinationQueueSession.createSender(Queue queue)メソッド発行時に,指定したキューの名前が設定されます。
Message.setJMSDestination()メソッドでこのヘッダを設定できません。
送信側ではメッセージ送信完了後に取得できます。受信側では取得できません。
2JMSDeliveryModeメッセージ送信時にCosminexus RMがhrmmkqueコマンドの-mオプション指定値に従って設定します。
Message.setJMSDeliveryMode()メソッドでこのヘッダを設定できません。
メッセージ受信後に取得できます。
3JMSMessageIDメッセージ送信時にCosminexus RMが設定します。また,デッドメッセージ再登録時にCosminexus RMが再設定します。
Message.setJMSMessageID()メソッドでこのヘッダを設定できません。
送信側ではメッセージ送信完了後に取得できます。受信側では取得できません。
4JMSTimestampメッセージ送信時にCosminexus RMが設定します。また,デッドメッセージ再登録時にCosminexus RMが再設定します。
Message.setJMSTimestamp()メソッドでこのヘッダを設定できません。
送信側ではメッセージ送信完了後に取得できます。受信側では取得できません。
5JMSExpiration送信側ではメッセージ送信時にCosminexus RMがキュー属性(メッセージ有効期間)に従って設定します。ローカルキュー送信の場合も同様です。また,デッドメッセージの再登録時にCosminexus RMが登録するキューの属性(メッセージ有効期間)に従って再設定します。
キュー間転送を実施した場合,受信側では,受信側ローカルキューの属性の設定によって次のように異なります。
  • メッセージ有効期間の選択が受信側となっている場合は,受信側のキュー属性(メッセージ有効期間)に従って設定されます。
  • メッセージ有効期間の選択が送信側となっている場合は,WS-Reliability電文のExpiryTimeタグと同じ値が設定されます。
キュー間転送の場合,送信側ではメッセージ送信完了後に取得できます。受信側では別の値が取得できます。
6JMSRedeliveredメッセージをアプリケーションに配送したが,リカバーされたなどでもう一度配送する必要があるときにtrueに設定されます。
Message.setJMSRedelivered()メソッドでこのヘッダを設定できません。
Cosminexus RMを再度開始すると,falseに設定されます。
メッセージ受信後に取得できます。
7JMSPriority送信側ではQueueSender.setPriority()メソッドまたはQueueSender.send()メソッドで指定したpriorityの値が設定されます。両方のメソッドでpriorityが指定されている場合は,QueueSender.send()メソッドで指定した値が優先されます。
キュー間転送を実施した場合,受信側で受信メッセージが永続される前に,デフォルト値が設定されます。
Message.setJMSPriority()メソッドでこのヘッダを設定できません。
キュー間転送の場合,送信側ではメッセージ送信完了後に取得できます。受信側では別の値が取得できます。
8JMSReplyToMessage.setJMSReplyTo()メソッド発行時に,指定値が設定されます。設定は任意です。
受信側からのメッセージ返信を必要とする場合,送信側のユーザがこのヘッダにあて先を設定します。
送信側では設定タイミング後に取得できます。受信側では取得できません。
9JMSCorrelationIDMessage.setJMSCorrelationID()メソッド発行時に,指定値が設定されます。設定は任意です。送信側では設定タイミング後に取得できます。受信側では取得できません。
10JMSTypeMessage.setJMSType()メソッド発行時に,指定値が設定されます。設定は任意です。送信側では設定タイミング後に取得できます。受信側では取得できません。
注※
表中に示したタイミング以外でヘッダの値を取得した場合,ヘッダが設定されていないときの値が返されます。詳細については,「7.4.4 Messageインタフェース」を参照してください。

(2) JMSメッセージのプロパティ

JMSメッセージのプロパティは,ヘッダに追加する制御情報が格納されたフィールドです。次に示す種類があります。

  1. JMS定義のプロパティ
    JMSが定義するプロパティです。これらのプロパティの完全なセットは,JMS仕様で定義されています。
    半角英字だけで定義され,大文字と小文字は区別されます。
  2. Cosminexus RM固有のプロパティ
    Cosminexus RMが独自に提供するプロパティです。
    半角英字だけで定義され,大文字と小文字は区別されます。
  3. アプリケーション指定のプロパティ
    ユーザが必要に応じて定義するプロパティです。ただし,使用できるプロパティ名には制限があります。
    プロパティ名には半角および全角を使用できます。また,大文字と小文字は区別されます。
(a) JMS定義のプロパティ

JMS定義のプロパティの一覧について,次の表に示します。

表2-9 JMS定義のプロパティの一覧

項番プロパティ説明
1JMSXUserIDjava.lang.Stringメッセージを送信するユーザのユーザ識別子です。
このプロパティは未サポートです。
2JMSXAppIDjava.lang.Stringメッセージを送信するアプリケーションのアプリケーション識別子です。
このプロパティは未サポートです。
3JMSXConsumerTXIDjava.lang.Stringメッセージが受信および承認されたトランザクションのトランザクション識別子です。
このプロパティは未サポートです。
4JMSXProducerTXIDjava.lang.Stringメッセージが生成されたトランザクションのトランザクション識別子です。
このプロパティは未サポートです。
5JMSXRcvTimestamplongメッセージがコンシューマに配送された配送時刻です。
時刻の値はミリ秒で測定した現在時刻と協定世界時のUTC1970年1月1日午前0時との差です。
6JMSXDeliveryCountintメッセージ配送回数です。
7JMSXStateintコンシューマから送信されたメッセージの各コピーの状態を示す値です。
このプロパティは未サポートです。
8JMSXGroupIDjava.lang.Stringメッセージが属しているグループのグループ識別子です。
9JMSXGroupSeqintメッセージが属しているグループのシーケンス番号です。

JMS定義のプロパティの設定タイミングと取得タイミングについて,次の表に示します。

表2-10 JMS定義のプロパティの設定タイミングと取得タイミング

項番プロパティ設定タイミング取得タイミング
1JMSXUserID
2JMSXAppID
3JMSXConsumerTXID
4JMSXProducerTXID
5JMSXRcvTimestampメッセージをコンシューマに配送した際に,Cosminexus RMが設定します。メッセージ受信後に取得できます。
6JMSXDeliveryCountメッセージ承認時にCosminexus RMが設定します。Cosminexus RMを再度開始すると,この値は0に設定されます。メッセージ受信後に取得できます。
7JMSXState
8JMSXGroupIDMessage.setStringProperty("JMSXGroupID", groupID)またはsetObjectProperty("JMSXGroupID", groupID)メソッド発行時に,指定したgroupIDの値が設定されます。設定は任意です。ユーザが設定できる文字数は半角全角を問わないで512文字以下です。設定タイミング後に取得できます。
9JMSXGroupSeqMessage.setIntProperty("JMSXGroupSeq", seq)メソッド発行時に,指定したseqの値が設定されます。設定は任意です。
ユーザが設定できる値は0以上です。
設定タイミング後に取得できます。
(凡例)
-:未サポートのため該当しません。

また,ObjectMessage(ペイロードにBytesContainerを含む)を送受信した場合のJMS定義のプロパティの設定タイミングと取得タイミングについて,次の表に示します。

表2-11 ObjectMessage(ペイロードにBytesContainerを含む)を送受信した場合のJMS定義のプロパティの設定タイミングと取得タイミング

項番プロパティ設定タイミング取得タイミング
1JMSXUserID
2JMSXAppID
3JMSXConsumerTXID
4JMSXProducerTXID
5JMSXRcvTimestampメッセージをコンシューマに配送した際に,Cosminexus RMが設定します。メッセージ受信後に取得できます。
6JMSXDeliveryCountメッセージ承認時にCosminexus RMが設定します。Cosminexus RMを再度開始すると,この値は0に設定されます。メッセージ受信後に取得できます。
7JMSXState
8JMSXGroupIDMessage.setStringProperty("JMSXGroupID", groupID)またはsetObjectProperty("JMSXGroupID", groupID)メソッド発行時に,指定したgroupIDの値が設定されます。設定は任意です。ユーザが設定できる文字数は半角全角を問わないで512文字以下です。送信側では設定タイミング後に取得できます。受信側では取得できません。
9JMSXGroupSeqMessage.setIntProperty("JMSXGroupSeq", seq)メソッド発行時に,指定したseqの値が設定されます。設定は任意です。
ユーザが設定できる値は0以上です。
送信側では設定タイミング後に取得できます。受信側では取得できません。
(凡例)
-:未サポートのため該当しません。

(b) Cosminexus RM固有のプロパティ

Cosminexus RM固有のプロパティの一覧について,次の表に示します。

表2-12 Cosminexus RM固有のプロパティの一覧

項番プロパティ説明
1JMS_HITACHI_DeadMessageTimestamplongメッセージがデッドメッセージキューに移動された時刻を示す値(単位:ミリ秒)です。
時刻の値はミリ秒で測定した現在時刻と協定世界時のUTC1970年1月1日午前0時との差です。
2JMS_HITACHI_DeadMessageCausejava.lang.Stringメッセージがデッドメッセージキューに移動された原因を示す文字列です。
3JMS_HITACHI_DeadMessageOriginalQueueNamejava.lang.Stringメッセージがデッドメッセージキューに移動される前に保存されていたキュー名です。
4JMS_HITACHI_DeadMessageIDjava.lang.Stringデッドメッセージを一意に識別するための値です。このプロパティの値は,コンフィグレーションプロパティのRMSystemNameプロパティの値と現在時刻および通番によって決定されます。
注※
次の表に示す文字列のどれかが設定されます。

表2-13 デッドメッセージキューに移動された原因を示す文字列

項番文字列説明
1DMQCAUSE-001メッセージが有効期限に達しました。
2DMQCAUSE-002メッセージの配送回数が最大値に達しました。
3DMQCAUSE-003順序制御のために滞留しているメッセージが有効期限に達しました。または,滞留しているメッセージの属しているグループが閉鎖しました。
4DMQCAUSE-004メッセージの受信に失敗した通知を受け取りました。

Cosminexus RM固有のプロパティ固有のプロパティの設定タイミングと取得タイミングについて,次の表に示します。

表2-14 Cosminexus RM固有のプロパティの設定タイミングと取得タイミング

項番プロパティ設定タイミング取得タイミング
1JMS_HITACHI_DeadMessageTimestampメッセージがデッドメッセージキューに保存される際に,Cosminexus RMが設定します。
なお,デッドメッセージが再登録される際に削除します。
デッドメッセージキューからメッセージを受信したあとで取得できます。
2JMS_HITACHI_DeadMessageCauseメッセージがデッドメッセージキューに保存される際に,Cosminexus RMが設定します。
なお,デッドメッセージが再登録される際に削除します。
デッドメッセージキューからメッセージを受信したあとで取得できます。
3JMS_HITACHI_DeadMessageOriginalQueueNameメッセージがデッドメッセージキューに保存される際に,Cosminexus RMが設定します。
なお,デッドメッセージが再登録される際に削除します。
デッドメッセージキューからメッセージを受信したあとで取得できます。
4JMS_HITACHI_DeadMessageIDメッセージがデッドメッセージキューに保存される際に,Cosminexus RMが設定します。なお,デッドメッセージが再登録される際に削除します。デッドメッセージキューからメッセージを受信したあとで取得できます。
(c) アプリケーション指定のプロパティ

ユーザが必要に応じて定義するプロパティです。

ユーザは,メッセージインタフェースのset<型名>Property()メソッドのname引数に任意のプロパティ名を指定してプロパティに値を設定します。get<型名>Property()メソッドのname引数にsetメソッドと同じ名前を指定してプロパティから値を取得します。

プロパティ名はユーザの実装に依存します。ただし,次に示す名前は使用できません。

(d) プロパティの型変換

Cosminexus RM固有のプロパティとアプリケーション指定のプロパティに設定できる型は,boolean,byte,short,int,long,float,doubleおよびStringです。書き込まれたときと異なる型でプロパティを読み取る場合,型は変換されます。

プロパティの型変換について,次の表に示します。

表2-15 プロパティの型変換

書き込み時の型読み取り時の型
booleanbyteshortintlongfloatdoubleString
boolean      
byte   
short    
int     
long      
float     
double      
String
(凡例)
○:型が変換されます。
空白:型が変換されません。読み取り時にJMSException(MessageFormatException)が発生します。
String型で書き込まれた文字列をString以外の型に変換して読み取る場合,書き込まれた文字列を,変換後の型でラッパークラスのvalueOfメソッドによって解釈できないとき,java.lang.NumberFormatExceptionが発生します。

(3) JMSメッセージのペイロード

JMSメッセージのペイロードは,メッセージ本体のフィールドです。

Cosminexus RMは,次に示すメッセージインタフェースを提供します。各メッセージインタフェースのペイロードについて,次の表に示します。

表2-16 メッセージインタフェースのペイロード

項番インタフェース名ペイロードの説明
1Messageペイロードがありません。
2BytesMessageペイロードがプリミティブなバイトの配列です。
3ObjectMessageペイロードがシリアライズできるJavaオブジェクトです(BytesContainerおよびユーザが定義したクラスのオブジェクトを格納できます)。
4TextMessageペイロードがjava.lang.String型です。
注※
非永続版リソースアダプタの場合,ObjectMessageのペイロードにBytesContainerは格納できません。

(a) ObjectMessageのペイロードにBytesContainerを格納する場合

永続版リソースアダプタの場合,ObjectMessageオブジェクトのsetObjectメソッドの引数にBytesContainerオブジェクトを指定することで,BytesContainerを含むObjectMessageを送信することができます。詳細は「7.7 転送データ相互接続用インタフェースの使い方」を参照してください。

(b) ObjectMessageのペイロードにユーザが定義したクラスのオブジェクトを格納する場合

ObjectMessageのペイロードにユーザが定義したクラスのオブジェクトを格納する場合は,送受信するアプリケーションにユーザが定義したクラスを含める必要があります。アプリケーションにユーザが定義したクラスを含めない場合は,CosminexusのJ2EEサーバ用オプション定義ファイルにユーザが定義したクラスまたはクラスが含まれるJARのクラスパスを,コンテナ拡張ライブラリとして指定する必要があります。

これらの設定や指定をしていない場合,取り出したメッセージからペイロードを取得するときに例外が発生します。ペイロードの取得で例外が発生した場合でも,取り出したメッセージのトランザクションが決着すると,メッセージが配信済みになるので注意してください。

また,Cosminexus RM 01-02以前でキューに登録したメッセージを移行した場合や,Cosminexus RM 01-02以前とキュー間転送する場合も,CosminexusのJ2EEサーバ用オプション定義ファイルにユーザが定義したクラスまたはクラスが含まれるJARのクラスパスを,コンテナ拡張ライブラリとして指定する必要があります。

CosminexusのJ2EEサーバ用オプション定義ファイル(usrconf.cfg)は,次に示す場所に格納されています。

<Cosminexusのインストールディレクトリ>¥CC¥server¥usrconf¥ejb¥<サーバ名>¥usrconf.cfg

usrconf.cfgファイルをテキストエディタで開き,次の行を追加します。

add.class.path=<コンテナ拡張ライブラリ用のclassまたはJARのクラスパス>

J2EEサーバ用オプション定義ファイルについては,マニュアル「Cosminexus リファレンス 定義編」を参照してください。