概要
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)
) は別のトランザクションにする必要があります.
同じトランザクションにすると,トランザクションがコミットするまで相手側は要求メッセージを受信することができません.
そのため応答メッセージが返ってくることもなく,受信処理は完了しません.