Поскольку мы используем много bean-компонентов @ApplicationScoped с транзакциями, но не хотим использовать EJB (bean-компонент ApplicationScoped не работает с bean-компонентами без сохранения состояния), мы создаем собственный перехватчик транзакций, например:
@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: команда не может быть выполнена, когда глобальная транзакция находится в состоянии IDLE
Раньше мы использовали управляемую транзакцию Seam3, и, похоже, она работает нормально. Но это больше не работает в Wildfly. Мы попробовали модуль jpa от Deltaspike, но, похоже, у него возникли проблемы с транзакциями вокруг нескольких источников данных (не-JTA, кажется, все в порядке), даже если мы следовали их инструкциям.
Мы также пробовали @Applicationscoped @TransactionalManagement, но это не дает нам транзакцию.
Каковы мои варианты использования Wildfly, но не @Stateful или @Statelss @Singleton и т. д.?