Cosminexus V9 アプリケーションサーバ Cosminexus Reliable Messaging
Reliable Messagingは,JMSメッセージを送受信することでアプリケーション連携します。JMSメッセージは,ヘッダ,プロパティおよびペイロードの三つの要素で構成されます。
JMSメッセージの構成を次の図に示します。
図2-25 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が登録するキューの属性(メッセージ有効期間)に従って再設定します。 キュー間転送を実施する場合,受信側では,受信側ローカルキューの属性の設定によって次のように異なります。
|
メッセージ送信完了後に取得できます。 |
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を含む)を送受信した場合のヘッダの設定タイミングと取得タイミングを次の表に示します。
表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が登録するキューの属性(メッセージ有効期間)に従って再設定します。 キュー間転送を実施した場合,受信側では,受信側ローカルキューの属性の設定によって次のように異なります。
|
キュー間転送の場合,送信側ではメッセージ送信完了後に取得できます。受信側では別の値が取得できます。 |
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()メソッド発行時に,指定値が設定されます。設定は任意です。 | 送信側では設定タイミング後に取得できます。受信側では取得できません。 |
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以上です。 |
送信側では設定タイミング後に取得できます。受信側では取得できません。 |
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文字以下です。 | 設定タイミング後に取得できます。 |
ユーザが必要に応じて定義するプロパティです。
ユーザは,メッセージインタフェースのset<型名>Property()メソッドのname引数に任意のプロパティ名を指定してプロパティに値を設定します。get<型名>Property()メソッドのname引数にsetメソッドと同じ名前を指定してプロパティから値を取得します。
プロパティ名はユーザの実装に依存します。ただし,次に示す名前は使用できません。
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 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
JMSメッセージのペイロードは,メッセージ本体のフィールドです。
Reliable Messagingは,次に示すメッセージインタフェースを提供します。各メッセージインタフェースのペイロードを次の表に示します。
表2-16 メッセージインタフェースのペイロード
項番 | インタフェース名 | ペイロードの説明 |
---|---|---|
1 | Message | ペイロードがありません。 |
2 | BytesMessage | ペイロードがプリミティブなバイトの配列です。 |
3 | ObjectMessage※ | ペイロードがシリアライズできるJavaオブジェクトです(BytesContainerおよびユーザが定義したクラスのオブジェクトを格納できます)。 |
4 | TextMessage | ペイロードがjava.lang.String型です。 |
永続版リソースアダプタの場合,ObjectMessageオブジェクトのsetObjectメソッドの引数にBytesContainerオブジェクトを指定することで,BytesContainerを含むObjectMessageを送信できます。詳細は「7.7 転送データ相互接続用インタフェースの使い方」を参照してください。
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サーバ用オプション定義ファイルについては,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。
All Rights Reserved. Copyright (C) 2012, 2015, Hitachi, Ltd.