概要
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両方の修正が反映されています.