[英]Handling TransactionTimeout Exception in EJB
我有一個名為methodA()的EJB方法,該方法調用了另一個稱為methodB()的EJB方法,該方法啟動了一個新的容器管理的事務。 在methodB中,我正在強制由catchB正確捕獲但未傳播到methodA的事務超時。 但是我很驚訝methodA接收到Exception。 我在這里想念東西嗎?
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已經吃掉了它。 我看到的是“不應該在這里”而不是“打印我!”的輸出。 這讓我想知道,盡管方法B已經拋出了Timeout異常,但是容器在方法B完成之后是否立即引發了EJBTransactionTimeoutException的另一個異常?
Thread.sleep()
永遠不會拋出TransactionTimeoutException
,因此此catch塊無法捕獲此異常。
當EJB A從EJB B調用methodB時,它不會直接調用Bean方法。 它在代理上調用methodB。 該代理負責處理事務管理,安全性等,然后在bean實例上調用實際的methodB。
因此,methodB不會引發異常。 它是從包裝EJB B的代理中調用的,當包裝的Bean實例的methodB返回時,代理將引發TransactionTimeoutException,並且執行所花費的時間超過了配置的超時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.