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に追加しているのだろうか.それを解き明かしたい.