Cosminexus V9 アプリケーションサーバ Cosminexus Reliable Messaging

[目次][用語][索引][前へ][次へ]

2.5.1 JMSメッセージの構成

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

JMSメッセージの構成を次の図に示します。

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

[図データ]

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

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

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

ヘッダの一覧を次の表に示します。

表2-6 ヘッダの一覧

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

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

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

項番 ヘッダ 設定タイミング 取得タイミング
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()メソッド発行時に,指定値が設定されます。設定は任意です。 設定タイミング後に取得できます。

注※
表中に示したタイミング以外でヘッダの値を取得した場合,ヘッダが設定されていないときの値が返されます。詳細については,「7.4.4 Messageインタフェース」を参照してください。

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

表2-8 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が登録するキューの属性(メッセージ有効期間)に従って再設定します。
キュー間転送を実施した場合,受信側では,受信側ローカルキューの属性の設定によって次のように異なります。
  • メッセージ有効期間の選択が受信側となっている場合は,受信側のキュー属性(メッセージ有効期間)に従って設定されます。
  • メッセージ有効期間の選択が送信側となっている場合は,WS-Reliability電文のExpiryTimeタグと同じ値が設定されます。
キュー間転送の場合,送信側ではメッセージ送信完了後に取得できます。受信側では別の値が取得できます。
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()メソッド発行時に,指定値が設定されます。設定は任意です。 送信側では設定タイミング後に取得できます。受信側では取得できません。

注※
表中に示したタイミング以外でヘッダの値を取得した場合,ヘッダが設定されていないときの値が返されます。詳細については,「7.4.4 Messageインタフェース」を参照してください。

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

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

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

JMS定義のプロパティの一覧を次の表に示します。

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

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

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

表2-10 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定義のプロパティの設定タイミングと取得タイミングを次の表に示します。

表2-11 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固有のプロパティの一覧を次の表に示します。

表2-12 Reliable Messaging固有のプロパティの一覧

項番 プロパティ 説明
1 JMS_HITACHI_DeadMessageTimestamp long メッセージがデッドメッセージキューに移動された時刻を示す値(単位:ミリ秒)です。
時刻の値はミリ秒で測定した現在時刻と協定世界時のUTC1970年1月1日午前0時との差です。
2 JMS_HITACHI_DeadMessageCause java.lang.String メッセージがデッドメッセージキューに移動された原因を示す文字列です。
3 JMS_HITACHI_DeadMessageOriginalQueueName java.lang.String メッセージがデッドメッセージキューに移動される前に保存されていたキュー名です。
4 JMS_HITACHI_DeadMessageID java.lang.String デッドメッセージを一意に識別するための値です。このプロパティの値は,コンフィグレーションプロパティのRMSystemNameプロパティの値と現在時刻および通番によって決定されます。
5 JMS_HITACHI_UnitID java.lang.String パラレル取り出し属性(ただし,同一ユニット識別子の配信順序制御)で利用するユニット識別子の値です。このプロパティの値は,ユーザがアプリケーションで送信するメッセージに対して設定します。

注※
次の表に示す文字列のどれかが設定されます。

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

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

Reliable Messaging固有のプロパティ固有のプロパティの設定タイミングと取得タイミングを次の表に示します。

表2-14 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です。書き込まれたときと異なる型でプロパティを読み取る場合,型は変換されます。

プロパティの型変換を次の表に示します。

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

書き込み時の型 読み取り時の型
boolean byte short int long float double String
boolean            
byte      
short        
int          
long            
float          
double            
String

(凡例)
○:型が変換されます。
空白:型が変換されません。読み取り時にJMSException(MessageFormatException)が発生します。

String型で書き込まれた文字列をString以外の型に変換して読み取る場合,書き込まれた文字列を,変換後の型でラッパークラスのvalueOfメソッドによって解釈できないとき,java.lang.NumberFormatExceptionが発生します。

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

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

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

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

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

注※
非永続版リソースアダプタの場合,ObjectMessageのペイロードにBytesContainerは格納できません。

(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サーバ用オプション定義ファイルについては,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。