我没有使用 Spring,所以没有任何帮助,只是简单的 Java EE 7,我为批处理作业构建了一个步骤监视拦截器,它记录每个步骤(成功与否)并将结果保存在 DB 中。现在,对于不成功的步骤,我捕获了异常并调用了 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);
}
为了这个问题,我简化了我的代码。我的问题是为什么此事务对于批处理作业步骤的正常流程工作正常,并且在引发异常时无法持续存在,是否有解决方法?我尝试使用 dontRollbackOn 为异常添加事务,我在所有方法中尝试了诸如 REQUIRED 或 REQUIRES NEW 之类的 TransactionAttribute,但没有运气。我正在从事的项目也迫使我只使用注释方法,因此目前无法使用 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)