首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会话bean内的ejb3隔离(自治)事务

会话bean内的ejb3隔离(自治)事务
EN

Stack Overflow用户
提问于 2012-05-23 18:44:49
回答 1查看 1.3K关注 0票数 2

我使用的是XA (两阶段)事务。我想通过log类和Entity Manager记录到一个日志表中。我在EJB会话bean中的方法如下所示:

代码语言:javascript
复制
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方法之前,我创建用户事务,如下所示:

代码语言:javascript
复制
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();
    }
}

无论提交是否完成,我都想记录日志。怎么做?

问候

EN

回答 1

Stack Overflow用户

发布于 2012-05-24 00:31:53

事务属性仅在通过代理调用时才相关。它们不适用于直接调用,包括私有方法。尝试如下所示(它使用EJB 3.1无接口视图,但如果只有EJB 3.0,则可以为日志记录创建单独的本地接口):

代码语言:javascript
复制
@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事务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10718360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档