TX その11 TxManagerの次のポイント

"org.jboss.tm.TxManager"クラスはJBossにおける"javax.transaction.TransactionManager"の実装クラスです.

「TX その1 JTAによる分散トランザクションの構成要素の定義」で一度触れたように,TransactionManagerというのはJTAの中で中心的な役割をにないます.

JBossではJNDI名"java:/TransactionManager"でバインドされているTransactionManager実装クラスが使われる仕組みになっていますので,ここを書き換えておけばTxManager以外のTransactionManager実装をJBossに使わせることも可能です.

TxManagerはデフォルトでは,オブジェクト名"jboss:service=TransactionManager",実装クラス"org.jboss.tm.TransactionManagerService"のMBeanによりMBean開始時(startServiceメソッド)に"JNDI名"java:/TransactionManager"でバインドます.多くの他のMBeanがこのMBeanに依存(depends)していますので,別のTransactionManager実装クラスに換装する場合には,"org.jboss.tm.TransactionManagerService"に代わるクラスを用意してそのクラスがオブジェクト名"jboss:service=TransactionManager"のMBeanとしてJBossに組み込まれるようにするのが良いでしょう.

以上がこれまでの連載によるTransactionManager実装に関する概要まとめです.さて,ようやくですがいよいよこの中身に入っていきます.



まずTxManagerが何者なのか,何をするのかを明確にしなければなりません.以下のコードを書いて実行してしました.

public void testTxManager() throws Exception {
    TxManager tx = TxManager.getInstance();
    tx.begin();
    tx.commit();
}

何も起きませんでした.何のメッセージも出さず,データソースへのcommitなども一切行わずに正常終了します.

このTxManagerクラスは,JNDI名"java:/UserTransaction"を使って取得できるUserTransactionインスタンスのcommitメソッドなどを読んだ際に,処理が委譲されるクラスです.またBMTに限らず,CMTでも同様に使われるクラスです.

UserTransaction実装クラスですが,JBossではローカル環境ではServerVMClientUserTransactionが実装クラスとして使われます.JBossのドキュメントに自身のトランザクション機能のことを"in memory, very fast"とか書いてあると思いますが,要するにこのクラスが使われる際のことを言っています.

話がそれましたが,単にTxManagerを動かしただけでは駄目だということです.おそらくデータソースと関連付けを行う必要があります.次はこのあたりのソースを追いかけてみます.