JBossAS7でトランザクションの動作を確認する

Spring3 入門を読んでいて、トランザクションの開始・終了がEJBを使ったJavaEEアプリケーションでも出力できないか考えてみた。

CDIのTransactionnal Observerで試行錯誤 : 失敗

CDIでは、トランザクションの成功・失敗・開始などの合わせてイベントを起動するTransactional Observerと呼ばれる仕様がある。

しかし、下記のように明示的にfire()でイベント発火する必要があり、ちょっとトランザクションの挙動をロギングする用途にはアプリケーションには余分なコードに見えてしまう。あくまでWeld Referenceの例のように、トランザクションの成功・失敗をフックに、何かListの状態を変更したり、なんらかのビジネスロジックを実行するために使いそうだ。

@Inject @Any Event<Book> bookEvent;

public void createBook(Book book) {
    em.persist(book);
    // イベントを呼び出す側(Producer)。明示的にfireする。
    productEvent.select(new AnnotationLiteral<Created>(){}).fire(book);
}

// イベントで呼ばれる側(Comsumer)
void addBook(@Observes(during = AFTER_SUCCESS) @Created Book book) {
    System.out.println("トランザクションが成功した");
}

JBoss AS7のロギングシステムにcom.arjuna.ats.jtaカテゴリを追加 : 成功?

アプリケーションサーバに依存してしまうが、JBossのトランザクション実装のログレベルを以下のようなコマンドで追加したら、それらしきログがでてきた。もともとJBoss AS7にはcom.arjunaカテゴリにWARNが設定されているが、com.arjunaカテゴリをTRACEに変更するとたくさんログが出てきたので、JTA関連の部分にだけ絞り込んでTRACEに変更した。ROOTロガーでなければ、起動中に変更しても反映されるようだ。

$ ${JBOSS_HOME}/bin/jboss-cli.sh
/subsystem=logging/logger=com.arjuna.ats.jta:add
/subsystem=logging/logger=com.arjuna.ats.jta:write-attribute(name="level", value="TRACE")

上記の設定をすると、以下のようなログがでてきた。

TRACE [com.arjuna.ats.jta] (MSC service thread 1-1) BaseTransaction.begin
TRACE [com.arjuna.ats.jta] (MSC service thread 1-1) BaseTransaction.commit


これでEJBを使ってトランザクションを設定したときに、動きをログから確認することができた。