我使用的是XA (两阶段)事务。我想通过log类和Entity Manager记录到一个日志表中。我在EJB会话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();
}
}无论提交是否完成,我都想记录日志。怎么做?
问候
发布于 2012-05-24 00:31:53
事务属性仅在通过代理调用时才相关。它们不适用于直接调用,包括私有方法。尝试如下所示(它使用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事务。
https://stackoverflow.com/questions/10718360
复制相似问题