TransactionRequiredException при сохранении внутри блока исключений try / catch - PullRequest
1 голос
/ 01 октября 2019

Я не использую Spring, так что это не поможет, просто Java EE 7, и я создал перехватчик мониторинга шага для пакетных заданий, который регистрирует каждый шаг (успешно или нет) и сохраняет результаты в БД. Теперь для неудачных шагов я перехватываю исключение и вызываю метод logQueryOutcome, и кажется, что когда выбрасывается исключение, транзакция больше не доступна, и я не могу начать новую.

 public Object monitorStep(InvocationContext invocationContext) {
    try {
        //business logic here
        logQueryOutcome(invocationContext, result, timedDescription);
        return invocationContext.proceed();
    } catch (Exception e) {
        logQueryOutcome(invocationContext, result, timedDescription);
        return null;
    }
}

private void logQueryOutcome(InvocationContext invocationContext, String result, String timedDescription) {
    stream(invocationContext.getParameters()).filter(s -> s instanceof String).forEach(s -> {
        String queryName = (String) s;
        monitoringRepository.logStepResult(queryName);
    });
}

И в введенномКласс MonitoringRepository, реализация которого для logStepResults:

public void logStepResult(String queryName) {
    //Object instantiation and build
    Object obj = new Object(queryName)
    entityManager.persist(obj);
}

Я упростил свой код ради вопроса. Мой вопрос: почему эта транзакция работает нормально для обычного потока шагов пакетного задания и не сохраняется при возникновении исключения, и есть ли обходной путь для этого? Я пытался добавить Transactional с dontRollbackOn для исключений, я пробовал TransactionAttribute, например, REQUIRED или REQUIRES NEW во всех методах, но не повезло. Проект, над которым я работаю, также заставляет меня использовать только подходы к аннотациям, поэтому использование Session или получение транзакций от менеджера сущностей в настоящее время невозможно. Это исключение:

Failed to run batchlet org.jberet.job.model.RefArtifact@32ba50d7: javax.persistence.TransactionRequiredException: WFLYJPA0060: Transaction is required to perform this operation (either use a transaction or extended persistence context)
    at org.jboss.as.jpa.container.AbstractEntityManager.transactionIsRequired(AbstractEntityManager.java:877)
    at org.jboss.as.jpa.container.AbstractEntityManager.persist(AbstractEntityManager.java:579)
    at com.myproj.MonitoringRepository.logStepResult(MonitoringRepository.java:28)
...