ejb sessionbean中的嵌套事务 - bean管理的事务

时间:2015-01-14 21:52:23

标签: java java-ee ejb-3.0 jboss5.x

我有以下代码,用于保存用户并发送JMS消息。目前我正在使用UserTransaction包装saveUserSendMessage。当事务嵌套时,我在ejb中得到一个异常。我可以在下面做什么来使嵌套事务成为可能?

@Resource(mappedName = "java:/JmsXA")
private static QueueConnectionFactory queueConnectionFactory;

@Resource(mappedName = "EjbQueueJndi")
private static Queue queueProp;

@PersistenceContext(unitName = "ejbPersistanceunit")
private EntityManager em;

@Resource
UserTransaction ut;

@Override
public boolean saveUserSendMessage(String name, String email, int age,
        boolean arg3) throws Exception {

    UserTransaction xact = ut;
    xact.begin();

    saveUser(name, email, age);
    sendMessage("Successfully saved the user");
    try {
        if (arg3)
            throw new Exception("Unsuccessfull");
        xact.commit();
    } catch (Exception e) {
        xact.rollback();
        throw e;
    }
    return true;
}

@Override
public boolean saveUser(String name, String email, int age)
        throws Exception {
    try {
        ut.begin();
        UserEntity ue = new UserEntity();
        ue.setAge(age);
        ue.setEmail(email);
        ue.setName(name);
        em.persist(ue);
        ut.commit();
    } catch (Exception e) {
        e.printStackTrace();
        throw e;
    }
    return true;
}

我得到的例外:

15:51:04,127 ERROR [STDERR] javax.transaction.NotSupportedException: BaseTransaction.checkTransactionState - [com.arjuna
.ats.internal.jta.transaction.arjunacore.alreadyassociated] [com.arjuna.ats.internal.jta.transaction.arjunacore.alreadya
ssociated] thread is already associated with a transaction!

1 个答案:

答案 0 :(得分:2)

Java EE不支持嵌套事务。它唯一支持的是挂起事务,运行不相关的事务,以及恢复第一个事务。

要实现这一点,您需要调用另一个使用RequiresNew事务属性的EJB。请注意,即使消息接收回滚,内部事务也可以完成,这意味着如果消息传递引擎崩溃,则可能会再次运行第二个事务。或者,您可以将EJB更改为使用bean管理的事务,这会产生类似的效果。

你确定你真的想这么做吗?最好只在容器管理的事务中执行逻辑。