S2JMS 開発記 SVN へお引っ越し
しますた.リポジトリは以下です.
以下の Eclipse プロジェクトがあります.
まだ Maven2 の pom.xml
は用意していません.ごめんなさい.
以下,各プロジェクトの簡単な説明.
s2jca
S2JCA の本体です.
seasar2
と s2-tiger
プロジェクトに依存しています.
s2jca-jdbc
S2JCA を Sun の JDBC Connector というリソースアダプタを使ってテストするためのプロジェクトです.
テストする際は,seasar2
に含まれている hsql/bin/runHsqldb.bat
を実行して HSQLDB を起動する必要があります.
seasar2
と s2-tiger
,s2jca
に依存しています.
s2jca-activemq
S2JCA を ActiveMQ のリソースアダプタを使ってテストするためのプロジェクトです.
テストする際は,activemq/bin/activemq.bat
を実行して ActiveMQ ブローカーを起動する必要があります.
seasar2
と s2-tiger
,s2jca
に依存しています.
s2jms
S2JMS の本体です.現在は S2JMS-Core と S2JMS-Connector だけが含まれています.
単体テストは限りなく皆無に近いです.心より恥じる.
seasar2
と s2-tiger
,s2jca
プロジェクトに依存しています.
s2jms-activemq
S2JMS を ActiveMQ を使ってテストするためのプロジェクトです.
s2jca-activemq
と異なり,ActiveMQ のリソースアダプタではなく,S2JMS-Connector を使います.
テストする際は,s2jca-activemq
に含まれている ActiveMQ ブローカーを起動する必要があります.
seasar2
と s2-tiger
,s2jca
,s2jca-activemq
,s2jms
に依存しています.
以上.
すべて 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>)
それぞれ,TextMessage
,BytesMessage
,ObjectMessage
,MapMessage
を作成して送信します.
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 標準のインタフェース.
S2JCA と S2JMS-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
QueueFactory
と TopicFactory
はそれぞれ QueueSession#createQueue(String)
,TopicSession#createTopic(String)
で Destination
を作成します.
SimpleDestinationFactory
は単にプロパティに設定された Queue
や Tipic
のインスタンスを宛先とします.Queue
なんかを JavaBeans として使える場合これがよいかと.
JndiDestinationFactory
は文字通り JNDI から Queue
なんかをルックアップします.Tomcat 上などで 宛先を JNDI で管理したい場合に使えるかもしれませんが,あまり使わないと思う.OracleAQ で必要になるかも? って感じ.
ReplyToDestinationFactory
は返信用で,プロパティに設定された Message
の getJMSReplyTo()
の戻り値を宛先とします.
メッセージの受信も似ていて,
org.seasar.jms.core.MessageReceiver
というインタフェースを使います.実装クラスはこれ.
org.seasar.jms.core.impl.MessageReceiverImpl
こいつには単純にメッセージを受信するために次のメソッドがあります.
-
String receiveText()
byte[] receiveBytes()
Serializable receiveObject()
Map receiveMap()
それぞれ,TextMessage
,BytesMessage
,ObjectMessage
,MapMessage
を受信してそのボディを返します.期待と異なるメッセージを受信するとキャストできずに例外が吹っ飛びます.たぶん.
プロパティの
-
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 勉強会に来たことあるでしょ?
きっとそうに違いない!! 確定.
今度会ったらカミングアウトするように.
Jazz 90 - 80 Lakers
(ToT)
5 連敗でまたしても借金生活.
二桁得点は Odom 一人だけ.
やっぱり Kobe がいないと話になりませんね...
めざましテレビ
今日の早耳ムスメは臼田あさ美ちゃーん,お題は「カラダにうれしい!! ヘルシーメニューのお店」.
昨年のラストが直ちんで,新年のスタートがあさみちゃん.
よくわかってるじゃないですか,スタッフの人.グッジョブ!!
で,ですね.
オープニングで早耳ムスメ全員集合 (合成だけど) で新年の挨拶があるわけですが,右下の人誰?
っていうか,消去法で比瑠川游ですか.えーっと,もしかして初登場以来ごぶさた?
で,ですね.
もしかしてもしかするともしかしなくても,みさきゆうさんがいないよ?
そういえばみさきゆうさんも長いこと見かけていない気のせいがします.ハニカミで見かけたけど.
オフィシャルサイトにはまだ名前がありますが,そうですか卒業したということですか.
せっかく「早耳ムスメのハマリもの 〜ver.」を「早耳ムスメのハマリもの 〜編」に変えたのに...
ともあれ (JW),お疲れ様でした>みさきゆうさん
そんなわけで (どんなわけで?),今年も頑張ってねぇ〜>早耳ムスメ