2012-05-23 28 views
1

我正在使用XA(2階段)事務。我想通過Log類和Entity Manager登錄到一個日誌表。我在EJB Session bean中的方法如下:我想在獨立於任何「外部」事務的孤立(自治)事務中使用它。我已經嘗試在方法名稱前添加@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)並且不起作用。ejb3會話bean內部的隔離(自治)事務

之前,我打電話EJB3方法創建類似的用戶交易:

try { 
    UserTransaction transaction = (UserTransaction)context.lookup("javax.transaction.UserTransaction"); 
    transaction.begin(); 
    // Call EJB3 method 
    transaction.commit(); 
} catch (Throwable t) { 
    t.printStackTrace(); 
    try { 
     transaction.rollback(); 
    } catch (SystemException e) { 
     e.printStackTrace(); 
    } 
} 

我想,如果提交已完成或不記錄不管。如何?通過代理調用時

問候

回答

0

交易屬性纔有意義。它們不適用於直接呼叫,其中包括私人方法。嘗試類似如下(使用EJB 3.1的無接口視圖,儘管你可以創建一個記錄一個單獨的本地接口,如果你只有EJB 3.0):

@Stateless 
@Local(BusinessInterface.class) 
@LocalBean 
public class MyBean { 
    @EJB MyBean logger; 

    @TransactionAttribute(REQUIRED) 
    public void businessMethod() { 
    try { 
     ... 
    } catch (Throwable t) { 
     logger.logError(t); 
     ... 
    } 
    } 

    @TransactionAttribute(NOT_SUPPORTED) 
    public void logError(Throwable t) { 
    ... 
    } 
} 

的重要的一塊是在調用LOGERROR發生通過一個注入的EJB代理,允許容器控制在方法持續時間內暫停XA事務。

+0

是的。但在方法logError中,我想「提交」數據,無論用戶(來自XA事務)是否提交或回滾所有內容。我已經嘗試過,但不工作...內部logError我堅持()和之後flush()。但沒有運氣。 10倍 – zmeda