簡體   English   中英

在EJB中處理TransactionTimeout異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM