解決したい問題のコンテキスト: 外部システムとの通信を監査する Java spring http インターセプター AuditHttpCommunicationInterceptor があります。通信を行う HttpClieant は、DoBusinessLogicSevice と呼ばれるビジネス ロジックを実行する Java サービス クラスで使用されます。DoBusinessLogicSevice は新しいトランザクションを開き、いくつかの共同作業者を使用して多くのことを行います。
解決すべき問題: DoBusinessLogicSevice での操作の結果 (予期しない例外など) に関係なく、AuditHttpCommunicationInterceptor によって監査をデータベースに保存したいと考えています。
私が使用した解決策: AuditHttpCommunicationInterceptor は、次の方法で新しいトランザクションを開きます。
TransactionDefinition transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
new TransactionTemplate(platformTransactionManager, transactionDefinition).execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// do stuff
}
});
すべて正常に動作します。DoBusinessLogicSevice の一部が予期しない例外をスローすると、そのトランザクションはロールバックされますが、AuditHttpCommunicationInterceptor は監査をデータベースに保存します。
このソリューションから生じる問題: AuditHttpCommunicationInterceptor は新しいデータベース接続を使用します。したがって、DoBusinessLogicSevice 呼び出しごとに 2 つのデータベース接続が必要です。基本的に、問題の解決策を知りたい: TransactionTemplate を現在のトランザクションを「一時停止」し、この場合、新しいトランザクションの接続を再利用する方法。
何か案は?:)
PS Oneのアイデアは、別の設計アプローチを取ることかもしれません.インターセプターをドロップし、DoBusinessLogicSeviceで直接使用されるAuditingHttpClientを作成します(Springによって呼び出されません)が、そこにあるすべてのhttpフィールドにアクセスできないため、それを行うことはできません.