TX その6 CMT宣言からたどる

CMTかBMTかといった設定はejb-jar.xmlに記述されるもの.J2EEサーバ側ではデプロイ時にこのXMLファイルに書かれた内容をパースしてEJBコンテナの振る舞いをどのようにするかを決定するという流れになる.

JBossではEJB1つにつきEJBContainerも1つそれに対応させて生成するアーキテクチャを採用している.つまりCMTであればejb-jar.xmlに" Container"と書くわけだが,この情報がいろいろ経由してEJBContainerの生成時の引数として渡されることになる.

ではその各EJBにあわせたEJBContainerを生成しているのはどのクラスか?というとちょっとまだ自信がないのだが,どうやら"org.jboss.ejb.EjbModule"クラスであるようだ.このクラスにcreateStatelessSessionContainerメソッド他,各タイプのEJBを生成するためのprivateメソッドが揃っている.

それらのメソッドはさらに最終的にinitializeContainerメソッドというprivateメソッドの呼び出しに集約される.このinitializeContainerメソッドの引数を各タイプに合わせて用意している.CMTかBMTかの違いはまだここでも影響がでない.initializeContainerメソッドの中の最後の1行,addInterceptorsメソッドへの引数に使用されてさらに委譲されている.ここもまだスルーだったか.

addInterceptorsメソッドの中では,各種設定ファイルで定義されたInterceptorをwhile文で回しながら実際にInterceptorとして追加するかしないかの判定をしている.ここで対象となるInterceptorはjboss-service.xmlやstandardjboss.xmlEJBに絡んだもの後者)に定義されているが,ejb-jar.xmlで"Container"と書いておくと,standardjboss.xmlのところでtransaction属性が定義されていないか,あるいは"Container"となっているものが追加されることになる.言い換えると"Container"と書けば"Bean"となっているInterceptorは追加されないというだけである.

さて,やっとこ1歩進んだ感じだ.次は"Container"に一致して追加されたInterceptorの実装クラスだ.