概要
S2JMS-Coreは,JMSメッセージを容易に送受信するためのコンポーネントを提供します. 主なコンポーネントのインタフェースは次の二つです.
MessageSender- JMSメッセージを送信する場合に使用するコンポーネントのインタフェースです.
MessageReceiver- JMSメッセージを受信する場合に使用するコンポーネントのインタフェースです.
いずれもdiconファイルに定義し,アプリケーションはS2コンテナからDIされたコンポーネントを使用します.
diconファイルへの定義については,
「コンフィグレーション
」-「アウトバウンド通信
」を参照してください.
MessageSender・MessageReceiverともスレッドセーフではありません.
diconに登録する際は必ずinstance属性をprototypeにしてください.
MessageSender
MessageSenderは、JMSメッセージを送信するコンポーネントです。
送信するJMSメッセージを容易に作成するために次のメソッドを使用することができます。
void send(byte[] bytes)引数で指定されたバイト列をペイロードデータとするBytesMessageを作成して送信します。void send(Map<String, Object> map)引数で指定されたMapに含まれるマッピングをペイロードデータとするMapMessageを作成して送信します。void send(Serializable object)引数で指定されたオブジェクトをペイロードデータとするObjectMessageを作成して送信します。void send(String text)引数で指定された文字列をペイロードデータとするTextMessageを作成して送信します。
例えば,TextMessageを送信する場合は次のようになります.
String text = ...;
sender.send(text);
作成されるJMSメッセージのヘッダを指定するには、次のメソッドを使用します。
MessageSender setCorrelationID(final String correlationID)MessageSender setCorrelationIDAsBytes(final byte[] correlationIDAsBytes)MessageSender setReplyTo(Destination replyTo)
作成されるJMSメッセージのプロパティを指定するには、次のメソッドを使用します。
MessageSender addProperty(String name, Object value)MessageSender addProperties(Map<String, Object> properties)
例えば,次のようになります.
sender.setCorrelationID(correlationID);
sender.addProperty("reply", true);
sender.send(text);
送信するJMSメッセージをより詳細に設定するには次のメソッドを使用します。
<MSGTYPE extends Message> send(MessageFactory)引数で指定されたMessageFactoryが作成したJMSメッセージを送信します。send()MessageSenderのプロパティに設定されたMessageFactoryが作成したJMSメッセージを送信します。
送信されたJMSメッセージを取得するには、次のメソッドを使用します。
Message getMessage()
例えば,次のようになります.
sender.send(text);
Message sentMessage = sender.getMessage();
送信されたJMSメッセージのヘッダを取得するには、次のメソッドを使用します。
String getMessageID()long getTimestamp()long getExpiration()
例えば,次のようになります.
sender.send(text);
String messageID = sender.getMessageID();
MessageReceiver
MessageReceiverは、JMSメッセージを受信するコンポーネントです。
受信したメッセージを容易に処理するために次のメソッドを使用することができます。
byte[] receiveBytes()受信したBytesMessageのペイロードデータであるバイト列を返します。Map<String, Object> receiveMap()受信したMapMessageのペイロードデータに含まれるマッピングを持つMapを返します。Object receiveObject()受信したObjectMessageのペイロードデータであるオブジェクトを返します。String receiveText()受信したTextMessageのペイロードデータである文字列を返します。
例えば,TextMessageを受信する場合は次のようになります.
String text = receiver.receiveText();
受信したJMSメッセージを独自に処理するには次のメソッドを使用することができます。
<MSGTYPE extends Message, T> T receive(MessageHandler<MSGTYPE, T> messageHandler)引数で指定するMessageHandlerにより自由にJMSメッセージを処理することができます。 このメソッドはMessageHandler#handleMessage(Message)の戻り値をそのまま返します。
受信したJMSメッセージをそのまま取得するには次のメソッドを使用することができます。
Message receive()
受信可能なJMSメッセージがまだ到着していない場合の動作は次のメソッドで設定します.
MessageReceiver setTimeout(long timeout)timeoutに指定する値は次のようになります.- 正の数
- JMSメッセージを受信するまで指定された時間待機します (ミリ秒単位)。
0- JMSメッセージが受信できなければ待機しません。
- 負の数
- JMSメッセージを受信するまで無期限に待機します。
受信するJMSメッセージを選択するために次のメソッドを使用することができます。
MessageReceiver setMessageSelector(String messageSelector)
受信したJMSメッセージを取得するには、次のメソッドを使用します。
receiveText()等を呼び出した後でもJMSメッセージを取得することができます.
void getMessage()
受信したJMSメッセージのヘッダを取得するには、次のメソッドを使用します。
void getMessageID()void getTimestamp()void getExpiration()
Tips
リクエスト~リプライ
要求メッセージを送信した後に応答メッセージを受信する,リクエスト~リプライ型のアプリケーションは次のように実現することができます.
public String send(String requestMessage) {
sender.send(requestMessage);
String messageID = sender.getMessageID();
return messageID;
}
public String receive(String messageID) {
receiver.setMessageSelector("JMSCorrelationID = '" + messageID + "'");
String replyMessage = receiver.receiveText();
return replyMessage;
}
送信した要求メッセージのJMSMessageIDヘッダの値と一致する
JMSCorrelationIDヘッダを持つメッセージだけを受信するように,
messageSelectorを指定します.
リクエスト~リプライ型のアプリケーションでは,要求メッセージの送信 (send(String)) と
応答メッセージの受信 (receive(String)) は別のトランザクションにする必要があります.
同じトランザクションにすると,トランザクションがコミットするまで相手側は要求メッセージを受信することができません.
そのため応答メッセージが返ってくることもなく,受信処理は完了しません.
