2012-02-23 18 views
1

私はSpring 3.0.5、Hibernate 3.6.7、Atomikos Transactionessentials 3.7.0を使用しています。 applicationContext.xmlでAOPを使用して構成されたトランザクション。 すべてうまく動作します。 (コミット、ロールバック)JTAトランザクションの内部にスローされた例外をキャッチする方法は?

私の意図は、特定の例外をjta-transactionの中に投げることです。 この方法でトランザクションをロールバックし、ロールバックの原因に関する詳細な情報を取得します。

問題は、私が捉えることができる唯一の例外は、トランザクションが予期せずロールバックされたことを示すatomikosによってスローされるロールバックトランザクションです。

トランザクション外で自分の例外をどのようにして得ることができますか?

ここには小さな例があります。私の説明が十分に良いかどうかわからないからです。 これは私の意図が何であるかを実証するためのものです。どんなタイプミスもコメントしないでください。

特定の例外(およびいくつかの標準的な例外であるかもしれない):

public class MySpecialException extends Exception { 
    public MySpecialException(String someInfo) { 
     super(someInfo); 
    } 
} 

例外をスローする宣言する方法declareingインターフェース:

public interface MyInterface { 
    Object someJtaTransactionMethod(String param) throws MySpecialException; 
} 

インタフェースを実装するクラス:

また、関数を呼び出してeをキャッチするコードxceptions。

public class Caller { 

    @Autowired 
    private MyInterface callee; 

    public void test() { 
     try { 
      callee.someJtaTransactionMethod("Some test"); 
     } catch (MySpecialException mex) { 
      // I want to get here 
     } catch (Exception ex) { 
      // but I only get here 
     } 
    } 
} 

これはまったく可能ですか?

更新:もちろん、私は例外の原因を見ました。例外自体はorg.springframework.transaction.UnexpectedRollbackExceptionです。原因はクラスjavax.transaction.RollbackTransactionであり、原因はcom.atomikos.icatch.RollbackExceptionです。

atomikosは例外に気付き、ロールバックを行いますが、atomikos(おそらく他のjta実装でも)は、トランザクションがロールバックされた(予期せず)ことを示す例外をスローします。私の例外はなくなった。

更新2:面白いことに、ロールバックする必要のあることを実行していない場合は、必要に応じて例外をキャッチできます。

更新3と解決策:JB Nizetは私に解決策を指摘しました。実際に私のトランザクションは、私が疑ったようにロールバックされていませんでしたが、私が例外を投げる理由のために、私は制約違反を持っていました。したがって、Atomicikosはコミットの例外を投げました。これで、私のトランザクションを、例外のためにロールバックするように設定したので、すべてが期待どおりに機能します。

+0

私はアトミコスを知らないのですが、あなたの例外をキャッチし、自分の原因としてあなた自身のものを投げることができますか?例外のgetCause()メソッドの戻り値を分析しましたか(2番目のcatchから) –

+0

はい私は例外を一度見て(開発中に複数回)、デバッグしようとしましたが、何も見つかりませんでした...更新された投稿 – AlexS

+0

スタックトレースとあなたが使用しているフレームワーク? –

答えて

3

あなたの例外は実行時例外か検査済み例外ですか?

実行時例外がスローされた場合は、デフォルトで春のロールバックが行われ、チェック例外がスローされた場合はデフォルトでコミットされます。

スタックトレースからは例外がチェックされた例外なので、Springはコミットしようとしますが、JTA TM(Atomikos)はコミットを拒否しているため(タイムアウトなどのため)できません。

この例外でロールバックが発生した場合は、実行時例外にするか、@ TransactionalアノテーションのrollbackFor属性で宣言します。ロールバックが発生してはならない場合は、Atomikosがコミットを拒否する理由を調べてください(タイムアウトが短すぎる、ログが役立つ可能性があります)。

+0

興味深い情報があります。通常、このような例外があった場合、私はatomikosにデバッグし、実際の原因を見つけました(たとえば、いくつかのhibernateまたはjdbc例外)。私は明日の朝にこの問題を検討し続けます.....私の目をもう守ることはできません。 – AlexS

+0

ありがとうございました。あなたは私の一日を救った。私は例外をRuntimeExceptionから継承するように変更しましたが、今はすべてが必要に応じて機能します。私はそのatomikosが私自身の例外を投げたときにロールバックしなかったことに気付かず、例外投げのために、私は何とか昨日atomikosにデバッグできなかった。 – AlexS

0

MyExceptionではなくExceptionから継承するMySpecialExceptionをスローすると、私のタイプのように見えますか?

それ以外の場合は、MyExceptionではなくMySpecialExceptionをキャッチします。

+0

私は既にこれが一例であり、誤植は問題ではないと言いました。私の実際のコードはコンパイルされ、間違いなく適切な例外をキャッチしようとします(それ以外の場合はコンパイラが教えてくれます...)。 – AlexS