Я не использую 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)