jpa - TransactionRequiredException 在 try/catch 异常块中持续存在时
问题描述
我没有使用 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)
解决方案
推荐阅读
- java - 是否可以将多个pdf页面合并到一张pdf并在java中打印?
- java - 找不到@SpringBootConfiguration
- keras - 在 Keras 中连接层
- javascript - 单击标记时如何将数据显示到文本字段
- javascript - 当“输入”被编程方法更改时,“更改”事件不会调用
- java - 霍夫曼压缩压缩文件比原始文件大
- bash - 在 Google-Cloud 的不同本地化中合并同名的 fastq.gz 文件
- reactjs - 当我们只能使用自定义钩子时,为什么还要使用 Provider 和 useContext 呢?
- swift - Firebase 我可以检索用户的电子邮件地址,但我不能在 IOS 客户端中使用它
- python - 为什么熊猫在字符串末尾添加“.0”?