1

私は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 を使用して Transactional を追加しようとしましたが、すべてのメソッドで REQUIRED または REQUIRES NEW などの TransactionAttribute を試しましたが、うまくいきませんでした。私が取り組んでいるプロジェクトでは、注釈アプローチのみを使用することを余儀なくされているため、現在、セッションを使用したり、エンティティ マネージャーからトランザクションを取得したりすることはできません。これは例外です:

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)
4

0 に答える 0