我正在使用XA(两阶段)交易。我想通过Log类和Entity Manager登录到一个日志表。我在EJB Session bean中的方法如下:
private void logError(Throwable throwable) {
LogEntity logEntity = new LogEntity();
// Set everything
entityManager.persist(logEntity);
}
我想在隔离(自治)交易中独立于任何“外部”交易。我已尝试在方法名称之前添加@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
和@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
,但无效。
在我调用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 :(得分: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代理进行的,它允许容器控制在logError
方法的持续时间内暂停XA事务。