TX その7 CMT/BMTに使われるインタセプタの違い
standardjboss.xmlというファイルは先頭付近を見るに,
<!-- ===================================================================== --> <!-- Standard JBoss EJB Configurations --> <!-- ===================================================================== -->
ということらしいです.
後から調べたらここ(http://docs.jboss.org/jbossas/jboss4guide/r1/html/ch01.html)に書いてありますね.勉強不足.orz
さてstandardjboss.xmlをざっと眺めるとStateless Session Beanのところとかには
<!-- CMT --> <interceptor transaction="Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor> <interceptor transaction="Container">org.jboss.ejb.plugins.CallValidationInterceptor</interceptor> <interceptor transaction="Container" metricsEnabled="true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor transaction="Container">org.jboss.webservice.server.ServiceEndpointInterceptor</interceptor> <interceptor transaction="Container">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor> <!-- BMT --> <interceptor transaction="Bean">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor> <interceptor transaction="Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor> <interceptor transaction="Bean">org.jboss.ejb.plugins.CallValidationInterceptor</interceptor> <interceptor transaction="Bean" metricsEnabled="true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor transaction="Bean">org.jboss.webservice.server.ServiceEndpointInterceptor</interceptor>
こんな風にかいてあります.違いは"TxInterceptorCMT"を突っ込んでいるのか"TxInterceptorBMT"を突っ込んでいるのかだけです.単純ですね.ほんとは"StatelessSessionInstanceInterceptor"の位置が異なるのも気になりますが今回は置いておきます.
その他の種類のEJBも見るとそれぞれいろいろ定義されていますが,「CMTならばTxInterceptorCMT」「BMTならばTxInterceptorBMT」とまとめてしまってよいでしょう.
個人的には昨日読んでいたソースに"metricsEnabled"に絡んだ処理があって意味不明だったのがこれを見て解消できたのが良かったです.
継承関係の整理
TxInterceptorCMT (extends) AbstractTxInterceptor (extends) AbstractInterceptor
TxInterceptorBMT (extends) AbstractTxInterceptorBMT (extends) AbstractTxInterceptor (extends) AbstractInterceptor
JavaDoc(http://docs.jboss.org/jbossas/javadoc/4.0.2/)に無いな〜と思ったらAbstractTxInterceptorとAbstractTxInterceptorBMTはpackage privateなクラスでした.でもTxInterceptorCMTとTxInterceptorBMTはpublicなクラスなので大丈夫.