2017-11-07 7 views
1

Spring 4.x、Hibernate 5.x、Spring-Data 1.11を使用しています。現在、SQLインターセプタはorg.hiberate.EmptyInterceptorまで拡張されています。 HibernateInterceptor.setInterceptorを使用してウェブリクエストの開始。 Springタスクスケジューラを介してバックグラウンドで実行されるジョブもあります。これらは独自のトランザクションを開始しますが、明らかにそれらに接続されたインターセプタを取得しません。この時点で私がしようとしているのは、すべての場合においてSpringの@Transactionalをインターセプトする方法を見つけることです。常にSpring 4.xトランザクションをインターセプトする方法

私はTransactionInterceptor@TransactionalEventListenerを調べましたが、今のところ動作していないため、現在Springでベストプラクティスと考えられているものを見つけるのは難しいです。

したがって、私たちが解決しようとしている問題は、トランザクションが失敗したかどうかを知る必要があることです。

Springでは、いつでもプレ/ポストコミットイベントを取得するための現行のベストプラクティスは何ですか?必要に応じて対応することができますか?

編集@TransactionalEventListenerが、それはそれが本当に何をしたかの私の部分にちょうど誤解だったので、私たちは春のイベントを使用していないと動作しないことに気づきました。 @TransactionalEventListenerを使用することです

@Aspect 
@Component 
public class AfterTransactionalAspect { 

    @After("@annotation(Transactional)") 
    public void cleanupAfterTransaction(JoinPoint joinPoint) throws Throwable { 
     // ... Do cleanup work here 
    } 

(あなたは春宛てのイベントを使用している場合)行くにはもう一つの良い方法:あなたがそれを行うことができ

+0

https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2#transaction-bound-events –

答えて

1

一つの方法は、のようなものをシンプルな様相を作成することです。

イベントを公開するにはApplicationEventPublisherを使用していますか?あなたの設定に@EnableTransactionManagementがありますか?@TransactionalEventListenerはパブリックメソッドでTransactionTemplateが設定されていますか?@Transactionalを公開イベントが発生する方法で使用していますか?

+0

TransactionalEventListernerについてもう少し読んだことがあります。私はそれを誤解したと思います。私たちの場合、私たちは自分自身でSpringを通してイベントを公開しているわけではないので、実際には私たちのためには機能しません。トランザクション終了時にクリーンアップを行う必要があります。そのため、トランザクションの終了が発生したときに関心が寄せられます。 – Zipper

+0

申し訳ありませんが、(インターセプターのような)あなたのためにそれを行うアスペクトを作成できますが、それを明示的にすることができます。編集済みの回答を参照してください。 – Dovmo

+0

ありがとう、私はそれを試みたが、私たちのWebサービスから発射されていないようです。最終的にはこれでうまくいく別の作業がありますが、Springにはこれを行うためのより良い方法がないことに驚いています。共通の要求であるように思えるが、そうは思わない。 – Zipper

関連する問題