S2JMS 開発記 SVN へお引っ越し

しますた.リポジトリは以下です.

S2JCA
https://www.seasar.org/svn/sandbox/s2jca
S2JMS
https://www.seasar.org/svn/sandbox/s2jms

以下の Eclipse プロジェクトがあります.

  • S2JCA
    • s2jca
    • s2jca-jdbc
    • s2jca-activemq
  • S2JMS
    • s2jms
    • s2jms-activemq

まだ Maven2pom.xml は用意していません.ごめんなさい.
以下,各プロジェクトの簡単な説明.

s2jca

S2JCA の本体です.
seasar2s2-tiger プロジェクトに依存しています.

s2jca-jdbc

S2JCA を Sun の JDBC Connector というリソースアダプタを使ってテストするためのプロジェクトです.
テストする際は,seasar2 に含まれている hsql/bin/runHsqldb.bat を実行して HSQLDB を起動する必要があります.
seasar2s2-tigers2jca に依存しています.

s2jca-activemq

S2JCAActiveMQ のリソースアダプタを使ってテストするためのプロジェクトです.
テストする際は,activemq/bin/activemq.bat を実行して ActiveMQ ブローカーを起動する必要があります.
seasar2s2-tigers2jca に依存しています.

s2jms

S2JMS の本体です.現在は S2JMS-Core と S2JMS-Connector だけが含まれています.
単体テストは限りなく皆無に近いです.心より恥じる.
seasar2s2-tigers2jca プロジェクトに依存しています.

s2jms-activemq

S2JMSActiveMQ を使ってテストするためのプロジェクトです.
s2jca-activemq と異なり,ActiveMQ のリソースアダプタではなく,S2JMS-Connector を使います.
テストする際は,s2jca-activemq に含まれている ActiveMQ ブローカーを起動する必要があります.
seasar2s2-tigers2jcas2jca-activemqs2jms に依存しています.


以上.
すべて Java5 でビルドする必要があります.
実際には昨年の春〜梅雨時に J2SE1.4 前提で書いたコードが多いため,微妙に Tiger なコードになっていない気のせいがしますが,気にしない気にしない.


S2JMS 開発記 S2JMS-Core

S2JMS の最大目標は MDB 的な非同期メッセージ受信アプリケーションのお手軽なプラットフォームを提供することですが,例えば Web コンテナ上のアプリケーションから非同期メッセージを送信する場合に便利なクラスなども S2JMS-Core として提供します.
そんなわけで (どんなわけで?),S2JMS-Core について簡単に紹介.


S2JMS-Core を使ってメッセージを送信するには

  • org.seasar.jms.core.MessageSender

というインタフェースを使います.実装クラスはこれ.

  • org.seasar.jms.core.impl.MessageSenderImpl

こいつには単純にデータを送信するために次のメソッドがあります.

    • void send(String)
    • void send(byte[])
    • void send(Serializable)
    • void send(Map<String, Object>)

それぞれ,TextMessageBytesMessageObjectMessageMapMessage を作成して送信します.


OracleAQ の PayloadMessage など非標準のメッセージを送信するとか,メッセージのヘッダやプロパティを設定したい場合は

    • <MSGTYPE extends Message> void send(MessageFactory<MSGTYPE>)

を使います.引数の

  • org.seasar.jms.core.message.MessageFactory<MSGTYPE>

は送信するメッセージを作成するもので,メソッド

    • MSGTYPE createMessage(Session)

が返すメッセージがそのまま送信されます.
標準の実装クラスとして

  • org.seasar.jms.core.message.impl.TextMessageFactory
  • org.seasar.jms.core.message.impl.BytesMessageFactory
  • org.seasar.jms.core.message.impl.ObjectMessageFactory
  • org.seasar.jms.core.message.impl.MapMessageFactory

を用意しています.


メッセージを送信先MessageSenderImpl のプロパティ

    • void setConnectionFactory(ConnectionFactory)
    • void setDestinationFactory(DestinationFactory)

で設定します.
ConnectionFactory は JMS 標準のインタフェース.
S2JCAS2JMS-Connector によるコネクションプーリングを使うことができます.これは当然 JTA 管理のトランザクションと連携します.

  • org.seasar.jms.core.destination.DestinationFactory

送信先javax.jms.Destination を提供するもので,以下の実装クラスを用意しています.

  • org.seasar.jms.core.destination.QueueFactory
  • org.seasar.jms.core.destination.TopicFactory
  • org.seasar.jms.core.destination.SimpleDestinationFactory
  • org.seasar.jms.core.destination.JndiDestinationFactory
  • org.seasar.jms.core.destination.ReplyToDestinationFactory

QueueFactoryTopicFactory はそれぞれ QueueSession#createQueue(String)TopicSession#createTopic(String)Destination を作成します.
SimpleDestinationFactory は単にプロパティに設定された QueueTipicインスタンスを宛先とします.Queue なんかを JavaBeans として使える場合これがよいかと.
JndiDestinationFactory は文字通り JNDI から Queue なんかをルックアップします.Tomcat 上などで 宛先を JNDI で管理したい場合に使えるかもしれませんが,あまり使わないと思う.OracleAQ で必要になるかも? って感じ.
ReplyToDestinationFactory は返信用で,プロパティに設定された MessagegetJMSReplyTo() の戻り値を宛先とします.




メッセージの受信も似ていて,

  • org.seasar.jms.core.MessageReceiver

というインタフェースを使います.実装クラスはこれ.

  • org.seasar.jms.core.impl.MessageReceiverImpl

こいつには単純にメッセージを受信するために次のメソッドがあります.

    • String receiveText()
    • byte[] receiveBytes()
    • Serializable receiveObject()
    • Map receiveMap()

それぞれ,TextMessageBytesMessageObjectMessageMapMessage を受信してそのボディを返します.期待と異なるメッセージを受信するとキャストできずに例外が吹っ飛びます.たぶん.
プロパティの

    • void setTimeout(long)

タイムアウト時間を設定することができます.
不特定あるいは非標準のメッセージを受信するとか,受信したメッセージのヘッダやプロパティも扱いたい場合は

    • <MSGTYPE extends Message, T> T receive(MessageHandler<MSGTYPE, T>)

を使います.引数の

  • MessageHandler<MSGTYPE extends Message, T>

は受信したメッセージを処理するもので,こいつのメソッド

    • T handleMessage(MSGTYPE)

にメッセージが渡されます.標準の実装として

  • org.seasar.jms.core.message.impl.TextMessageHandler
  • org.seasar.jms.core.message.impl.BytesMessageHandler
  • org.seasar.jms.core.message.impl.ObjectMessageHandler
  • org.seasar.jms.core.message.impl.MapMessageHandler

を用意しています.


ということで,簡単な非同期メッセージの送受信は

public class Hoge {
    private MessageSender sender;
    private MessageReceiver receiver;

    public String requestReply(String text) {
        sender.send(text);
        return receiver.receiveText();
    }
    ・・・
}

って感じでできちゃいます.たぶん.
ただし,上記のコードはトランザクショナルなコネクションではうまくいかないはず.
トランザクションをコミットするまで送信は完結しないので,その返信が返ってくるはずがないという.




S2JMS-Core は AOP でメッセージを送信するためのインターセプタも提供します.

  • org.seasar.jms.core.interceptor.SendMessageInterceptor

これは MessageSenderImpl を継承したクラスで,任意のメソッドに適用するとそのメソッドが正常終了した後にメッセージを送信します.どんなメッセージを送信するかはプロパティに設定された MessageFactory 次第.
こいつを既存の Web アプリケーションに適用することで,普通の Web アプリがサクッと非同期メッセージングアプリケーションに.


当然,S2JMS-Container 上のアプリケーションに対して SendMessageInterceptor を適用することもできます.
それにより,JMS API を使うことなく,要求メッセージを受信して応答メッセージを返すアプリケーションを作成することも可能になります.
という感じです>こもりさん


TextMessage をサポートするクラスとして,Velocity を使って文字列を編集するクラスがあります.

  • org.seasar.jms.core.message.text.VelocityTextFormatter

こいつの

    • void setTemplateText(String)

にテンプレート文字列を設定すると,編集結果を

    • String getText()

から得ることができます.テンプレート文字列中の変数は S2 コンテナ中のコンポーネントとして解釈されます.
なので,

<component name="sendInterceptor" class="org.seasar.jms.core.interceptor.SendMessageInterceptor">

<component class="org.seasar.jms.core.message.impl.TextMessageFactory"/>

<component class="org.seasar.jms.core.message.text.VelocityTextFormatter">
    <property name="templateText">$employeeDto.empno $employeeDto.ename</property>
</component>

って感じの dicon を用意すると,SendMessageInterceptor を適用したメソッドが終了するたびに VelocityTextFormatter が編集したテキストが送信されます.


以下業務連絡.
ぼうず (id:bowez) さんにお願いです.
テンプレートを dicon に文字列として書くバージョンに加えて,外部のファイル (.vm ファイルっていうの?) のパスを指定するバージョンをお願いします.
あと,Velocity って 2004 年の春に 1.4 がリリースされているのに 1.3.1 を使っているのは何か理由があるのですか?


某巨大掲示板

やってくれますな,53 さん.

57 名前:53[sage] 投稿日:2006/01/04(水) 16:20:11
 #CanCamのモデルである"山田優"が銀座に来たときにSeasar界隈の人が
 #握手したようですが、彼女が内心どう思っていたのかは謎。
 # http://d.hatena.ne.jp/koichik/20051127#1133078419 に反応
 #名前、間違えてました。銀座に来ていたのは"山田優"ではなく、"蛯原友里"
 #(特命係長・只野 仁の山吹一恵)です。
 #果たしてどういうつもりで「見覚えあります」っていったのかは謎です。
 #だいたいモデルに興味の無い人がJ2EE勉強会に行くんですか、いや、行かない。

そうですか行きませんか.
ってことはですよ,J2EE 勉強会に来てる人は全員モデルに興味があるということですね.
なぁんだ,それなら POSA 本の紹介なんてしてる場合じゃありませんよ.
よし,次回からは「モデル道場」を始めましょう!!
モデリング道場」ではありませんので念のため.
あちらは大事じゃない方のモデル,こちらは大事な方のモデル (笑).


っていうかですね,53 さん.
あなたもしかして,中の人じゃないですか? (^^;
どの程度中の人か分からないけど,結構近い感じがするんだよなぁ.
実はモデルに興味があるでしょ? J2EE 勉強会に来たことあるでしょ?
きっとそうに違いない!! 確定.
今度会ったらカミングアウトするように.


めざましテレビ

今日の早耳ムスメ臼田あさ美ちゃーん,お題は「カラダにうれしい!! ヘルシーメニューのお店」.
昨年のラストが直ちんで,新年のスタートがあさみちゃん.
よくわかってるじゃないですか,スタッフの人.グッジョブ!!


で,ですね.
オープニングで早耳ムスメ全員集合 (合成だけど) で新年の挨拶があるわけですが,右下の人誰?
っていうか,消去法で比瑠川游ですか.えーっと,もしかして初登場以来ごぶさた?
で,ですね.
もしかしてもしかするともしかしなくても,みさきゆうさんがいないよ?
そういえばみさきゆうさんも長いこと見かけていない気のせいがします.ハニカミで見かけたけど.
オフィシャルサイトにはまだ名前がありますが,そうですか卒業したということですか.
せっかく「早耳ムスメのハマリもの 〜ver.」を「早耳ムスメのハマリもの 〜編」に変えたのに...
ともあれ (JW),お疲れ様でした>みさきゆうさん


そんなわけで (どんなわけで?),今年も頑張ってねぇ〜>早耳ムスメ