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)
に渡される XAResource
を MessageEndpoint
実装クラスに憶えておいて,beforeDelivery(Method)
で TransactionManager#begin()
& Transaction#enlistResource(XAResource)
すればいいだけっぽい.
それなら楽勝♪
そんなわけで (どんなわけで?),この週末には MessageEndpoint
および MessageEndpointFactory
を実装しよう.
これが片づけば残りは ActivationSpec
くらいかな.これが面倒なんだよなぁ.