我有一個名爲methodA()的EJB方法調用另一個名爲methodB()的EJB方法,該方法啓動一個新的容器管理的事務。在methodB中,我迫使一個事務超時,這個事務被catchB正確捕獲,並且不傳播給methodA。但我很驚訝,methodA收到異常。我在這裏錯過了什麼?在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..");
}
}
第一種方法應該從來沒有捕捉到的異常(EJBTransactionTimeoutException),因爲的methodB都吃過了。我看到「不應該在這裏」的輸出,而不是「打印我!」。它讓我懷疑在methodB完成後,容器是否立即拋出EJBTransactionTimeoutException異常,儘管它已經拋出了Timeout異常?
@phewataal,你可以這樣思考:在methodB之前和之後插入代碼。這是由容器根據您的配置生成的代碼。所以,這段代碼會拋出異常。 – alexsmail
它是有道理的代理處理超時和拋出異常導致我的方法捕捉異常。但是,我只是在調試模式下運行我的JBOSS應用程序,並且能夠捕獲methodB引發的異常。這讓我想知道爲什麼我能夠在methodB中找到答案。 – phewataal
您在methodB中實際捕獲的異常的類型是什麼? –