TX その12 TxManagerから"Recoverable Resource"へ
先ほどのコード実行で何も起きなかった理由は簡単."Recoverable Resource"が存在していなかったからだ.
TransactionContextはTransctionManager内で自動的に生成される.言い換えると,TxManager内でTransactionImplインスタンスは自動的に生成される.
しかし"Recoverable Resource"であるXAResourceインタフェース実装インスタンスはそうではない.
TxManagerもTransactionImplに結構処理を委譲している.beginは自分で処理をしているが,XAResourceに対するcommit/rollbackはTransactionImplに委譲して行っている.
TxManagerがやっているのはTransactionContextを通じた状態管理とTransactionContextそのものの管理.TransactionContextであるTransactionImplインスタンスは"java.lang.ThreadLocal"クラスを使って各スレッドごとに保持されるようになっている.
1つのスレッドが1人のユーザからのリクエストを処理するというアーキテクチャなわけだから,まあ至極当然.
TxManagerのbegin/commit/rollback等のメソッドはstaticメソッドではないが,TxManagerオブジェクトそのものはJBossプロセス内で1つのみ生成されて,JTAを必要とする全てのBMT/CMTにおいてこの1つのインスタンスが使用される.従って上記のようなアーキテクチャとなるわけだ.
TransactionImplのcommitメソッドを見ると,登録済みのXAResourceに対してfor文で回しながら順番にさらにcommitを呼ぶというような記述が見られる.
従って先ほどのサンプルコードで言うなら,事前にXAResourceインスタンスを生成して登録しておかなければ,TxManagerに対してcommitを行ってもその中のTransactionImplのfor文が1回も中に入らないまま終了するわけで.
では次の疑問だが,このXAResourceは誰がいつどのようにして生成し,TransactionImplに追加しているのだろうか.それを解き明かしたい.