S2JMS 開発記 Re: こもりさんのコメント

へのレスです.

すごい勢いで進んでますね。

や,作夏辺りからほとんど前進していません (苦笑).
SendMessageInterceptor を含む S2JMS-Core はすなあそびのころからありましたから.
進歩したのは Velocity 対応を含めて,ぼうずさんが作ってくれた部分のみ...

アプリケーションからの送信メッセージはMessageFactory次第とのことですが、この場合は送信メッセージがある程度固定化されてしまいますよね。VelocityTextFormatterを使っても、プロパティをテキスト化して送信するのが精一杯では。

Velocity って #if とか #foreach とか使えるようなので,ある程度複雑なことはテンプレートエンジンの側でできるかなぁ,と思ってます.
実際にはそれで済まない場合ももちろんあって,アプリケーションの処理結果によってメッセージを送信したりしなかったり,全然違う種類のメッセージを送信したり,別の宛先へ送信したり等々,複雑な状況は普通にあると考えています.
が,それを S2JMS として対応することはあまり考えていません.
なぜなら秘策があるからです.それは...


です (謎なし).


は文字通りの謎ではなく,少なくとも存在することだけは間違いのないあるものを示しています.その意味で謎なし.
ですが,を我々が目にすることができるのか,できるとしたらいつなのかは文字通りの謎です.
ヒントはこのへんとか.
まぁ,が謎のままだとしても,昨年のすなあそびで発表のあった Trickle とか,他にも S2JBPM とか,S2Drools とか,S2JESS とか...
そういった飛び道具と組み合わせることができればいいなぁと妄想しています.

わたしのイメージだと、S2JSFでアクションの処理した結果をHTMLに埋め込むように、送信メッセージに埋め込むようなこともできればよいかと思ってます。

これは昨日書いた例でもできているような.
S2JSF だとアクションの処理結果は DTO に設定されますよね.
MessageFactory がその DTO を参照すればいいのではないかと.
昨日の例だと,

<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>

例えば employeeDtoempno は要求メッセージから設定される情報で,アクションを実行すると DB から該当する従業員名が employeeDtoename に設定されて,それを結果メッセージに設定して送信するとか.
このテンプレート文字列はメッセージ送信の度に評価されるので,その時の employeeDto の値が反映されます.
S2JSF の HTML テンプレートとあまり変わらないような.


MapMessage なんかだと,

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

<component instance="prototype" class="org.seasar.jms.core.message.impl.MapMessageFactory">
    <property name="map">fooDto.map</property>
</component>

みたいに MapMessageFactoryinstance="prototype" にして,その map プロパティにアプリケーションが処理した結果の Map が設定されるようにしたりとか.
あまりおすすめじゃないけど,

<component instance="prototype" class="org.seasar.jms.core.message.impl.MapMessageFactory">
    <property name="map">
        #{
            "empno" : employeeDto.empno,
            "ename" : employeeDto.ename
        }
    </property>
</component>

ということもできちゃったり.(^^;

アノテートされたフィールドからMessageFactoryが勝手にMapMessageを作って投げてくれるような感じです。これだと、あるロジックで処理した結果を別のロジックに投げてさらに処理・・・みたいなことが実現できると思うのですが、どうでしょう? (・・・と、これはS2JMSContainer側で実現すればいいんですかね?)

うーん,結果メッセージを作る時の情報 (アノテーション含む) は情報元の方より引っ張ってくる方にあった方がいいような.
上の例だと,employeeDto から empnoename を集めてくるわけですが,その情報が employeeDto の方にあったらちょっといやーん.
でもまぁ,この辺はいろいろアイディアを出して頂いて構いません.というか出してください (笑).


こもりさんも blog 始めません? S2JMS 専用でも構わないので (その場合は是非はてなで).
そこでいろいろ思いついたことを書いて頂けるとうれしいなぁ.