TX その13 TransactionContextにRecoverable Resourceを追加したのは誰

まだJCA方面についてはほとんど調査ができていないので確定ではないが,"org.jboss.resource.connectionmanager.TxConnectionManager"クラスがTransactionImplにXAResourceを追加していると思われる.

TransactionImplにXAResourceを追加するためには,そのためにはTransactionImplのenlistResourceメソッドを呼ぶ必要がある.このメソッドを呼んでいるのがこのTxConnectionManagerだ.

JBoss4 Application Server Guildの第7章(http://docs.jboss.org/jbossas/jboss4guide/r3/html/ch7.chapt.html)でJCAにおけるサーバとの連携の3つのタスクの1つ"Transaction Management"としてかかれている責務を引き受けているのがこのクラスと思われる.

TxConnectionManagerクラスのソースを流し読みすると,TxConnectionManagerサービス(こいつももちろんMBean)の開始時にTransactionManagerへの参照を取得しているのが分かった.

ところがこれが"本当に"TxManagerなのかどうかの証拠がここにはない.参照に使用しているオブジェクト名がsetterメソッド経由で設定されているからだ.別にこんなところにこだわらなくともどうせ正解かもしれないが,いつも通りきっちり拘っておきたい.

setterメソッドの名前"setTransactionManagerService"で全ソースを検索するも,これをcallしているやつがいない.何故だろう.

そこで例のいつもの強引な手法第2弾を実施することとした.やり方は簡単だ.単に"throw new RuntimeException"をコードに突っ込んで再コンパイル・再起動するだけ.これでこのsetterを呼んでいるやつがスタックトレースから明らかになる.再起動時にエラーが発生しなければこのメソッドは呼ばれないと分かる.

さてさっそくやってみよう

public void setTransactionManagerService(ObjectName transactionManagerService)
{
  this.transactionManagerService = transactionManagerService;
  throw new RuntimeException("transactionManagerService = " + transactionManagerService);
}

コンパイルして再起動.もはや手馴れたものだ.1分かからずに結果がわかる.

org.jboss.deployment.DeploymentException: Exception setting attribute javax.management.Attribute: 
 name=TransactionManagerService value=jboss:service=TransactionManager on mbean jboss.jca:name=DefaultDS,service=LocalTxCM;
 - nested throwable: (java.lang.RuntimeException: transactionManagerService = jboss:service=TransactionManager)
    at org.jboss.system.ServiceConfigurator.setAttribute(ServiceConfigurator.java:573)
    at org.jboss.system.ServiceConfigurator.configure(ServiceConfigurator.java:323)
    at org.jboss.system.ServiceConfigurator.internalInstall(ServiceConfigurator.java:164)
    at org.jboss.system.ServiceConfigurator.install(ServiceConfigurator.java:118)
    at org.jboss.system.ServiceController.install(ServiceController.java:200)

設定された値は"jboss:service=TransactionManager"だ.これで確認はとれた.呼び出していたのはServiceConfiguratorクラスのsetAttributeメソッド.

MBeanServer経由でsetter呼び出しですか.そりゃ検索してもでてこんわ.そういえば前にも1度こういうことあったような・・・.orz

ところで,TxConnectionManagerクラスには大量のクラスコメントがある.これはかなり手がかりになるかもしれない.