[Seasar-dev:67] [S2JMS] S2JMS.DAO

Koichi Kobayashi koichik
2005年 7月 21日 (木) 02:00:53 JST


小林 (koichik) です.

S2JMS.DAO についてのイメージです.

すなあそびで説明した S2JMS の <code>SendMessageInterceptor</code> は
アプリケーションが非同期メッセージのことなんか気にしなくてもメッセージを
送信できるというものでしたが,明示的に送受信したい場合もあるかと思います.

そんなわけで (どんなわけで?),S2JMS.DAO (仮称) です.
基本的には S2DAO や S2Hibernate.Dao の JMS 版.
例えばこんなインタフェースを用意して...

public interface FooMsgDao {
    void send(String text);
    void put(Map map);
    Object receive();
    byte[] get();
}

こいつに S2JMS.Dao のインターセプタを適用すると,send() や put() で
メッセージの送信が,receive() や get() でメッセージの受信が行えると
いう次第.
# put/get は MQSeries へのオマージュ (苦笑).
命名規則的は

(send|put).*          送信
(recv|receive|get).*  受信

としておいて,別途アノテーションでも指定できるといいかも.
ということは,S2JMS の最初の正式リリース版はバージョン 4.0 ですね.(^^;

そして引数または戻り値で Message の型が決まることにしましょう.
String なら TextMessage,Map なら MapMessage という具合.

あとメッセージヘッダおよびプロパティを指定できるようにする必要があります.
ヘッダで設定するのは JMSCorrelationID くらいなので,これは単独の byte[].
プロパティは Map で受け取るという感じでしょう.
これらの並びをどうするか?

send(String body)
send(Map property, String body)
send(byte[] correlationID, Map property, String body)

にするか,

send(String body)
send(String body, Map property)
send(String body, Map property, byte[] correlationID)

にするか.個人的には前者ですが,みんながわかりやすくて憶えやすい方で.

あとは Destination を指定できないといけないのですが,これは
アノテーションかなぁ.
省略時は S2Container から DestinationResolver.class をキーに
取得することにすれば,宛先が一つしかない場合に何も指定する必要が
なくなってよさげ.
複数の宛先が定義されていて明示的に指定する場合はアノテーションで.

/**
 * @org.seasar.jms.dao.Destination("hoge")
 */
void send(String);

この場合は "hoge" をキーに S2Container から取得したコンポーネント
(DestinationResolver) を使います.

/**
 * @org.seasar.jms.dao.Queue("hoge")
 */
void send(String);

この場合は QueueCreator を使うということで.
# DestinationResolver や QueueCreator 等は S2JMS-Core の
# org.seasar.jms.destination パッケージを参照してください.

後は... recv() で待ち時間を指定する必要がありますね.

String recv(long timeout)

みたいな.
他にも考慮漏れがあるかも.
とりあえず叩き台という事で.

-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>koichik @ improvement.jp</e-mail>
</signature>



seasar-dev メーリングリストの案内