私は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)