S2JMS 開発記 訂正:ExecutionContext と TransactionManager

01/03 に書いた「ExecutionContext と TransactionManager」は大間違いでした.
リソースマネージャが ExecutionContext に設定して WorkManager に渡す Xid は,「14. Transaction Inflow」で使うものらしい.
Transaction Inflow というのは 外部の TP モニタ (メインフレーム上の CICS とか) がトランザクションのオリジネータで,アプリケーションサーバがその配下で動くような場合の仕様.
このケースでは,アプリケーションサーバは外部のトランザクションマネージャに制御されるリソースのように動作するため,外から Xid が渡されるということらしい.
S2JMS ではこのケースをサポートする予定はないので,これは忘れてよさげ.


んで,通常のっていうかアプリケーションサーバが管理するトランザクションの基でメッセージを受信する際はというと,結局メッセージを処理するのと同一のスレッド (Work#run() の中) で処理するみたい.
少なくとも ActiveMQ と Sun の Generic Resource Adapter for JMS はそうなってる.
なーんだ,難しく考えることなかったよ.心より恥じる.


JCA 仕様的には「12.5.6 Transacted Delivery (Using Container-Managed Transaction)」あたりに書いてあるっぽい.
そんなわけで (どんなわけで?),アプリケーションサーバっていうか S2JCA では MessageEndpointFactory#createEndpoint(XAResource) に渡される XAResourceMessageEndpoint 実装クラスに憶えておいて,beforeDelivery(Method)TransactionManager#begin()Transaction#enlistResource(XAResource) すればいいだけっぽい.
それなら楽勝♪
そんなわけで (どんなわけで?),この週末には MessageEndpoint および MessageEndpointFactory を実装しよう.
これが片づけば残りは ActivationSpec くらいかな.これが面倒なんだよなぁ.