ARJUNA016053: не удалось зафиксировать транзакцию - таймер JavaEE6
У нас есть таймер, который запускает работу и выполняет некоторую обработку импорта / экспорта. Но при коммите мы открываем, сталкиваемся с ошибкой в названии. Мы уже попробовали несколько решений:
1.) Создано 2 класса:
@Stateless
public class MyBean {
@Inject
@JpaForJobs
private EntityManager em;
@Inject
private MyService1 service1;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void migrate(...) {
service1.create(...);
}
}
@Startup
@Singleton
public class MyService1 implements Job {
@Resource
TimerService timerService;
@Inject
private MyBean myBean;
@Timeout
public void trigger(Timer timer) {
migrate();
}
private void migrate() {
myBean.migrate();
}
}
Иногда работает, но когда отношения усложняются, они терпят неудачу. Пример У клиента есть ученик, у родителей есть кошки.
Я также пробовал транзакцию, управляемую бином, но с таким же окончанием:
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MyBean {
@Inject
@JpaForJobs
private EntityManager em;
@Inject
private MyService1 service1;
public void migrate(...) {
utx.begin();
service1.create(...);
utx.commit();
}
}
@Startup
@Singleton
public class MyService1 implements Job {
@Resource
TimerService timerService;
@Inject
private MyBean myBean;
@Timeout
public void trigger(Timer timer) {
migrate();
}
private void migrate() {
myBean.migrate();
}
}
Любая идея или предложения? Благодарю.
1 ответ
Решение
Оказывается, что подход 1 работает, и это просто мне нужно заменить:
@TransactionAttribute (TransactionAttributeType.REQUIRED)
с
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
Также у меня есть некоторые проблемы с анализом XML-файлов. Остерегайтесь ленивых полей и BeanUtils.cloneBean.