2014-03-04 63 views
3

由于我们在事务中使用了大量的@ApplicationScoped bean,但我们不想使用EJB(ApplicationScoped bean不适用于无状态bean),我们创建了自己的事务拦截器,如:Wildfly 8.0.0.Final JTA事务问题

@Resource 
UserTransaction tx; 
@Resource(mappedName="java:jboss/TransactionSynchronizationRegistry") 
TransactionSynchronizationRegistry tsr; 

@AroundInvoke 
public Object manageTransaction(InvocationContext context) throws Exception { 
    Object result; 
    if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) { 
     tx.begin(); 
     // System.out.println("Starting transaction"); 
     result = context.proceed(); 
     tx.commit(); 
    } else { 
     result = context.proceed(); 
    } 
    // System.out.println("Committing transaction"); 

    return result; 
} 

然而,JTA事务的情况下,我们得到了错误,如:

使用自己的TransactionInterceptor造成
造成的:值java.sql.SQLException:java.sql.SQLException中: XAER_RMFAIL:该命令不能执行ED当全局事务处于空闲状态

我们以前使用Seam3管理的事务,似乎工作的罚款。但它不再适用于Wildfly。我们尝试了Deltaspike的jpa模块,但它似乎在多个数据源(非JTA看起来很好)的事务中有问题,即使我们遵循了他们的指示。

我们也尝试了@Applicationscoped @TransactionalManagement,但它并没有给我们交易。

我在使用Wildfly时选择了什么,但没有@Stateful或@Statelss @Singleton等?

回答

1

您是否试过javax.transaction.Transactional(Java EE 7中的新增功能)?

@ApplicationScoped 
@Transactional 
public MyTransactionalBean { 
    // ... 
} 
+0

javax.transaction.Transactional可以正常工作。 – user3243153