首页 > 解决方案 > 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)

标签: jpajakarta-eejava-ee-7javax.persistence

解决方案


推荐阅读