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.

Другие вопросы по тегам