2012-01-19 9 views
1

私はmethodB()という別のEJBメソッドを呼び出すmethodA()というEJBメソッドを持っています。これは新しいコンテナ管理トランザクションを開始します。 methodBでは、私は正しくcaughtBによって捕捉され、methodAに伝播されないトランザクションタイムアウトを強制しています。しかし、私はメソッドAが例外を受け取ることに驚いています。私はここでsoemthingが欠けていますか?EJBでのTransactionTimeout例外の処理

methodA() { 
try { 
    methodB(); 
    System.out.println("print me!"); 
} catch(Exception e) { 
    System.out.println("shouldn't be here"); 
} 
} 

@TransactionTimeout(5) //5 sec timeout 
methodB() { 
    try { 
    Thread.sleep(6000); 
    } catch(Throwable t) { 
    System.out.println("Eating all the Exception.."); 
    } 
} 

メソッドBがそれを食べたので、最初のメソッドは例外(EJBTransactionTimeoutException)を検出してはいけません。私は "私を印刷してください!"の代わりに "ここにはいけない"という出力を見ています。それは、すでにタイムアウト例外がスローされているにもかかわらず、コンテナがmethodBが完了した直後にEJBTransactionTimeoutExceptionのもう1つの例外をスローするのでは不思議です。

答えて

3

Thread.sleep()TransactionTimeoutExceptionをスローしないため、このキャッチブロックがこの例外をキャッチすることはありません。

EJB AがEJB BからメソッドBを呼び出すとき、Beanメソッドを直接呼び出すことはありません。これは、プロキシでmethodBを呼び出します。このプロキシは、トランザクション管理、セキュリティなどを処理し、次にBeanインスタンスの実際のメソッドBを呼び出します。

したがって、メソッドBでは例外がスローされません。これは、EJB Bをラップするプロキシから呼び出され、ラップされたBeanインスタンスのmethodBが返ってきたときにTransactionTimeoutExceptionをスローし、設定されたタイムアウトを超えて実行するようになっています。

+0

@phewataalこのように考えることができます。メソッドBの前後にコードが挿入されています。これはあなたの設定に従ってコンテナによって生成されたコードです。したがって、このコードは例外をスローします。 – alexsmail

+0

プロキシがタイムアウトを処理していて例外をスローしていたことが、私のmethodAの結果として例外をキャッチしていたことになります。しかし、私はJBossアプリケーションをデバッグモードで実行しただけで、methodBによってスローされた例外をキャッチすることができました。なぜ私が方法Bを捕まえることができるのか不思議に思う。 – phewataal

+1

methodBで実際にキャッチした例外の種類は何ですか? –