2012-01-19 82 views
1

我有一個名爲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異常?

回答

3

Thread.sleep()從不拋出TransactionTimeoutException,所以這個catch塊沒有辦法捕獲這個異常。

當EJB A從EJB B調用methodB時,它不直接調用bean方法。它在代理上調用methodB。該代理負責處理事務管理,安全性等,然後調用bean實例上的實際方法B.

所以這個異常不是用methodB引發的。它由包裝EJB B的代理調用,並且在包裝Bean實例的methodB返回時引發TransactionTimeoutException,並且執行超過配置的超時。

+0

@phewataal,你可以這樣思考:在methodB之前和之後插入代碼。這是由容器根據您的配置生成的代碼。所以,這段代碼會拋出異常。 – alexsmail

+0

它是有道理的代理處理超時和拋出異常導致我的方法捕捉異常。但是,我只是在調試模式下運行我的JBOSS應用程序,並且能夠捕獲methodB引發的異常。這讓我想知道爲什麼我能夠在methodB中找到答案。 – phewataal

+1

您在methodB中實際捕獲的異常的類型是什麼? –