概要
S2JMS-Examplesは,次の二つのアプリケーションからなるサンプルです.
- s2jms-teeda-example
- S2JMS-Coreを利用してアウトバウンド通信を行うサンプルで, Teedaを利用したWebアプリケーションです.
- s2jms-server-example
- S2JMS-Containerを利用してインバウンド通信を行うサンプルで, S2JMS-Serverで起動するスタンドアロンアプリケーションです.
s2jms-teeda-exampleは,画面から入力された文字列をTextMessageのボディに設定して
Fooというキューにメッセージを送信します.
このメッセージにはneedReplyというboolean型のプロパティがあり,
画面で指定された値が設定されます.
この値がtrueの場合,s2jms-server-exampleはBarというキューに
応答メッセージを送信します.
応答メッセージもTextMessageです.
s2jms-teeda-exampleは,needReplyにtrueを設定した場合は応答メッセージを受信し,
そのメッセージを画面に表示します.

セットアップ
ダウンロード
「ダウンロード 」からS2JMS-Examplesをダウンロードしてください.
インストール
S2JMS-Examplesの配布ファイルは,Eclipseプロジェクトをアーカイブしたものになっています.
S2JMS-Examplesを実行するには,Sysdeo Tomcat Launcher プラグインが必要です. あらかじめインストールしてください.
以下の手順でS2JMS-ExamplesをEclipseワークスペースにインポートしてください.
- ダウンロードしたS2JMS-Examplesの配布ファイルを,Eclipseのワークスペースまたは適当なディレクトリに解凍してください.
- Eclipseの「File」-「Import」メニューで「Import Wizard」を開きます.
- 「Select a import source」で「General」-「Existing Project into Workspace」を選択し, 「Next」ボタンを押下します.
- 「Select a root directory」でS2JMS-Examplesの配布ファイルを解凍したディレクトリを指定します.
- 「Projects」で"s2jms-server-examplea","s2jms-teeda-example"がチェックされていることを確認して 「Finish」ボタンを押下します.
インポートされたs2jms-teeda-exampleプロジェクトを右クリックして,「Tomcatプロジェクト」-「Tomcatのコンテキストを更新」を選択します.
サンプルの起動
S2JMS-Server-Examleの起動
s2jms-server-exampleの起動方法は2種類あります. Eclipseのデバッガ上で起動する方法と,コマンドプロンプトから起動する方法です. デバッガ上で起動した場合はHOT deployモード,コマンドプロンプトから起動した場合はCOOL deployモードになります.
Eclipseのデバッガ上でs2jms-server-exampleを起動するには,
s2jms-server-exampleプロジェクトのsrc/test/javaソースフォルダ以下にある
org.seasar.jms.example.server.Mainクラスを開き,
「Run」-「Debug As」-「Java Application」を選択します.
コンソールに次のようなメッセージが表示されます.
2007-08-06 02:26:16.623 [DEBUG]
ActiveMQ Transport: tcp://localhost/127.0.0.1:61616
org.apache.activemq.transport.WireFormatNegotiator
tcp://localhost/127.0.0.1:61616 after negotiation:
OpenWireFormat{version=2, cacheEnabled=true, stackTraceEnabled=true,
tightEncodingEnabled=true, sizePrefixDisabled=false}
コマンドプロンプトからs2jms-server-exampleを起動するには,コマンドプロンプトを開いて s2jms-server-exampleプロジェクトのディレクトリへ移動し,次のコマンドを実行します.
java -jar lib\s2jms-server-x.y.z.jar --classpath build/classes
デバッガ上で起動した場合と同じメッセージが表示されます. コマンドプロンプトから起動したs2jms-server-exampleを停止するには, コマンドプロンプトでCtrl-Cを押下してください.
サンプルの実行
要求メッセージの送信
ブラウザで次のアドレスを開きます.

テキストフィールドに"Foo"と入力して「送信」ボタンを押下します.

s2jms-server-exampleのコンソールに次のように表示されます.
2007-08-06 02:40:09.998 [INFO] pool-1-thread-2 org.seasar.jms.example.server.listener.ExampleListener
properties : {needReply=false}
2007-08-06 02:40:09.998 [INFO] pool-1-thread-2 org.seasar.jms.example.server.listener.ExampleListener
message : Foo
要求メッセージの送信と応答メッセージの受信
ブラウザでテキストフィールドに"Bar"と入力してチェックボタンをチェックし,「送信」ボタンを押下します.

s2jms-server-exampleのコンソールに次のように表示されます.
2007-08-06 02:45:24.420 [INFO] pool-1-thread-4 org.seasar.jms.example.server.listener.ExampleListener
properties : {needReply=true}
2007-08-06 02:45:24.420 [INFO] pool-1-thread-4 org.seasar.jms.example.server.listener.ExampleListener
message : Bar
2007-08-06 02:45:24.576 [DEBUG] pool-1-thread-4 org.apache.activemq.transport.WireFormatNegotiator
Sending: WireFormatInfo { version=2, properties={TightEncodingEnabled=true, CacheSize=1024,
TcpNoDelayEnabled=true, SizePrefixDisabled=false, StackTraceEnabled=true,
MaxInactivityDuration=30000, CacheEnabled=true}, magic=[A,c,t,i,v,e,M,Q]}
ブラウザには次のように応答メッセージが表示されます.

ソースコード解説
s2jms-teeda-example
s2jms-teeda-exampleはDoltengで作成したTeedaアプリケーションをベースとしています.
送信画面のsend.htmlおよびSendPageについての詳細は
Teedaのドキュメントを参照してください.
JMSメッセージの送信は以下のクラスで行っています.
org.seasar.jms.example.teeda.web.send.MessagingService(インタフェース)org.seasar.jms.example.teeda.web.send.impl.MessagingServiceImpl(実装クラス)
MessagingServiceには,次のメソッドが定義されています.
String send(String text, boolean needReply)String receive(String id)
MessagingServiceImpl クラス
public class MessagingServiceImpl implements MessagingService {
@Binding(bindingType = BindingType.MUST)
protected MessageSender sender;
@Binding(bindingType = BindingType.MUST)
protected MessageReceiver receiver;
...
}
MessagingServiceImplクラスは,S2JMS-Coreが提供する
MessageSender型およびMessageReceiver型の
2つのフィールドを持っています.
@Bindingアノテーションが指定されているため,Seasar2によってこれらのフィールドに
コンポーネントが直接DIされます.
MessageSenderおよびMessageReceiverの詳細については,
「S2JMS-Core
」を参照してください.
String send(String text, boolean needReply) メソッド
public String send(final String text, final boolean needReply) {
sender.addProperty("needReply", needReply);
sender.send(text);
return sender.getMessageID();
}
send(String, boolean)メソッドは,TextMessageを送信します.
TextMessageのボディには,メソッドの第1引数で渡された文字列が設定されます.
また,TextMessageのプロパティにはneedReplyという名前の
boolean型のプロパティが設定されます.
needReplyプロパティの値は第2引数で渡された値です.
send(String, boolean)メソッドは,送信したTextMessageの
メッセージIDを返します.
String receive(String id) メソッド
public String receive(final String id) {
receiver.setMessageSelector("JMSCorrelationID = '" + id + "'");
return receiver.receiveText();
}
recieve(String)メソッドは,TextMessageを受信します.
直前にsend(String, boolean)によって送信されたメッセージに対する応答メッセージを受信するため,
メッセージセレクタで相関IDを指定しています.
相関IDの値は,send(String, boolean)メソッドの戻り値です.
receive(String)メソッドは,受信したTextMessageの
ボディに設定されている文字列を返します.
トランザクション
s2jms-teeda-exampleでは,トランザクション境界はPageクラスではなく,
Serviceクラスに設定されています.
もしPageクラスにトランザクション境界が設定されると,
送信したメッセージはPageクラスのメソッドが終了するまでトランザクションがコミットされないため,
s2jms-server-exampleはそのメッセージを受信することができなくなります.
そのため,応答メッセージが返ってくることもなく,receive(String)はメッセージを受信することができないために
画面を返すこともできなくなります.
リクエスト~リプライ型のアプリケーションでは,要求メッセージの送信と応答メッセージの受信は 別のトランザクションにする必要があります.
s2jms-server-example
s2jms-server-exampleは,S2JMS-Containerを利用したアプリケーションです.
S2JMS-ContainerがJMSメッセージを受信すると呼び出されるリスナ・コンポーネントは以下のクラスです.
org.seasar.jms.example.server.listener.ExampleListener
ExampleListenerには,次のリスナ・メソッドが定義されています.
void onMessage()
リスナ・コンポーネント及びリスナ・メソッドの詳細については, 「S2JMS-Container 」を参照してください.
ExampleListener クラス
public class ExampleListener {
private static Logger logger = Logger.getLogger(ExampleListener.class);
@Binding(bindingType = BindingType.MUST)
protected MessageSender messageSender;
@JMSHeader
protected String messageID;
@JMSProperty
protected Map<String, Object> properties;
@JMSProperty
protected boolean needReply;
@JMSBody
protected String text;
...
}
ExampleListenerクラスは,S2JMS-Coreが提供する
MessageSender型のフィールドを持っています.
@Bindingアノテーションが指定されているため,Seasar2によってこのフィールドに
コンポーネントが直接DIされます.
その他のフィールドにはS2JMS-Containerの提供するアノテーションが付けられているため, S2JMS-Containerによって受信したJMSメッセージのヘッダ,プロパティ,ボディの値がフィールドにバインドされます.
void onMessage() メソッド
public void onMessage() {
logger.info("message id : " + messageID);
logger.info("properties : " + properties);
logger.info("message : " + text);
if (needReply) {
messageSender.setCorrelationID(messageID);
messageSender.send("★★★ " + text + " ★★★");
}
}
受信メッセージがフィールドにバインドされた後,onMessage()メソッドが呼び出されます.
onMessage()メソッドは,受信したメッセージのヘッダ,プロパティ,ボディをログに出力します.
JMSメッセージのプロパティからバインドされたneedReplyがtrueの場合は
応答メッセージを送信します.
応答メッセージのボディは,受信メッセージのボディがバインドされたtextフィールドの
前後に星を付加した文字列です.
その際,応答メッセージの相関IDには,受信メッセージのIDを設定しています.
これにより,s2jms-teeda-exampleのMessagingServiceのreceive(String)メソッドは
応答メッセージだけを受信することができるようになります.
HOT deploy
s2jms-server-example・s2jms-teeda-exampleともHOT deployに対応しており, 起動したままソースを修正して即確認することができます.
s2jms-teeda-exampleの修正
s2jms-teeda-exampleプロジェクトのsrc/main/javaソースフォルダから次のクラスを開きます.
org.seasar.jms.example.teeda.web.send.SendPage
doSend()メソッドを次のように修正します.
public void doSend() {
final String id = messagingService.send("■" + sendMsg + "■", needReply);
s2jms-server-exampleの修正
s2jms-server-exampleプロジェクトのsrc/main/javaソースフォルダから次のクラスを開きます.
org.seasar.jms.example.server.listener.ExampleListener
onMessage()メソッドを次のように修正します.
public void onMessage() {
logger.info("message id : " + messageID);
logger.info("properties : " + properties);
logger.info("message : " + text);
if (needReply) {
messageSender.setCorrelationID(messageID);
messageSender.send("☆ " + text + " ☆");
}
}
修正後の確認
ブラウザで送信画面を開いてテキストフィールドに"Hoge"と入力し,
チェックボックスをチェックして「送信」ボタンを押下します.

s2jms-server-exampleのコンソールに次のように表示されます.
2007-08-06 03:24:26.107 [INFO] pool-1-thread-10 org.seasar.jms.example.server.listener.ExampleListener
message id : ID:Windows-01-2559-1186335607717-1:0:15:1:1
2007-08-06 03:24:26.107 [INFO] pool-1-thread-10 org.seasar.jms.example.server.listener.ExampleListener
properties : {needReply=true}
2007-08-06 03:24:26.107 [INFO] pool-1-thread-10 org.seasar.jms.example.server.listener.ExampleListener
message : ■Hoge■
ブラウザには次のように応答メッセージが表示されます.

s2jms-teeda-example・s2jms-server-example両方の修正が反映されています.
