About

ドキュメント

Javadoc

モジュール

プロジェクト文書

Built by Maven

概要

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は,needReplytrueを設定した場合は応答メッセージを受信し, そのメッセージを画面に表示します.

セットアップ

ダウンロード

ダウンロード 」から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を押下してください.

S2JMS-Teeda-Exampleの起動

s2jms-teeda-exampleを起動するには,メニューから「Tomcat」-「Tomcat起動」を選択してTomcatを起動します.

コンソールに次のようなメッセージが表示されます.

2007/08/06 2:33:47 org.apache.catalina.startup.Catalina start
情報: Server startup in 18688 ms

サンプルの実行

要求メッセージの送信

ブラウザで次のアドレスを開きます.

テキストフィールドに"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メッセージのプロパティからバインドされたneedReplytrueの場合は 応答メッセージを送信します. 応答メッセージのボディは,受信メッセージのボディがバインドされたtextフィールドの 前後に星を付加した文字列です. その際,応答メッセージの相関IDには,受信メッセージのIDを設定しています. これにより,s2jms-teeda-exampleのMessagingServicereceive(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両方の修正が反映されています.