2012-03-28 109 views
0

這是我的代碼有:處理HTTP從EJB事務中調用

// EJB

beanclass 1{ 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public String method1(){ 
method2(); 
DBupdates(); 

return ""; 
} 

} 

//普通的java類

class 2{ 
method 2(){ 
    //call which may take a long time (but dont want to wait for it to complete) 
    makes http calls to an external URL method(); 
}} 

的問題是:在HTTP通話可能需要很長時間。然而,調用的響應決定了方法1 - >數據庫更新和響應中的後續步驟。響應需要返回最終用戶,並且我不能讓最終用戶永遠等待。

我可以用兩種方式處理這種情況:

  1. 移動方法2到EJB,並把TransactionAttributeType.NEVER,使HTTP調用不在事務,方法1的交易不候在上面。在這種情況下,容器管理方法1的事務,並且不執行數據庫更新,如果它沒有從方法2回聽,則返回null。 method1的事務在「返回」之前等待多長時間?

  2. 我可以使用JBoss註釋並在method1()上放置2分鐘的TransactionTimeout:在這種情況下,如果http調用在2分鐘內未完成,則method1可以返回null並且不進行數據庫更新。

這兩種方法哪一種是明智的和防錯的? 感謝您的見解。

回答

0
  1. 當您使用TransactionAttributeType.NEVER時,事務不會進一步傳播。 對於返回Future<V>對象的方法,可以使用@Asynchronous註釋。然後你可以在對象上調用get(timeout, unit)來得到結果類型V,它等待操作的給定時間,但它是EJB-3.1特定的。

  2. 可以在方法或類級別嘗試JBoss特定標註@TransactionTimeout。也可以在jboss.xml或jboss-service.xml中配置它,具體取決於您的服務器版本。這對EJB-3.0來說會很好,但是會降低應用程序的可移植性。