У меня были те же требования, что и у вас, я записал что-то в базу данных в середине отката.
Я создал новый EJB с состоянием с @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
и вызвал метод сохранения, которыйхранит в базе данных.
Я не создал новый поток или что-то еще, потому что это должно быть обработано контейнером.
Так что в вашем случае, я думаю, ECMSDao
должен быть @Stateful
ejb с @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
, а не методом updateCurrentRetryInDB()
Обновление
Скажем, у вас есть нормальная ситуация, когда что-то хранится, и происходит откат.В этом примере я моделирую управляемую транзакцию.
public class Foo {
@PersistenceContext EntityManager em;
@Inject BarImpl bar; //can also use @EJB depending on your environment
public void fail() {
try {
//do some thing and throw exception to simulate rollback
throw new RuntimeException("Exception occured, please rollback");
} catch(Exception ex) {
bar.save(ex.getMessage()); // <-- This will store the exception message in a new transaction whilst the other transaction is safely rolledback
throw ex;
}
}
@Scope(SESSION)
@Stateful
@TransactionManagement(TransactionManagementType.CONTAINER) //default
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class BarImpl implements Bar {
@PersistenceContext EntityManager em;
@Destroy @Remove public void destroy(){}
public void save(String msg) {
MyEntity m = new MyEntity();
m.setMessage(msg);
em.persist(m);
}
}