私は現在進行中のトランザクションにトランザクションリスナーを追加したいspringframeworkアプリケーションを持っています。その動機は、下流のシステムに通知するポストコミットアクションを引き起こすことです。私はいくつかのサービスメソッドの周りにトランザクションをラップするために@Transactionalを使用しています。これはポストトランザクションリスナーを作成/登録する場所です。私は次のような "何か"をしたい。トランザクションリスナを春に動的に登録しますか?
public class MyService {
@Transaction
public void doIt() {
modifyObjects();
// something like this
getTransactionManager().registerPostCommitAction(new
TransactionSynchronizationAdapter() {
public void afterCommit() {
notifyDownstream();
}
});
}
}
Springには、私が欲しいと思うTransactionSynchronizationインターフェイスとアダプタクラスがあります。現行のトランザクションまたはトランザクション・マネージャのどちらに動的に登録するかはすぐには分かりません。私が避けることができれば、JtaTransactionManagerをサブクラス化しないでください。
Q:誰もこれまでにこれをしましたか?
Q:アダプターを登録する最も簡単な方法は何ですか?
ただし、これはどのトランザクションでも実行されません。私は幸運な完成を望むだけです。また、これらのAOPアノテーションをJDKプロキシだけのデフォルトのスプリング(コード製織を使用していない)で使用できますか? – Justin
メソッドが例外をスローするときにリターンアドバイスは実行されないので、メソッドがresultを返すときに@Transactionalをコミットし、例外をスローするときにロールバックします。アスペクトはバネの動的プロキシを介して呼び出されるため、コードを作成することはありません(バネからプロキシへのインタフェースを提供しない限り、実行時にcglibを使用してコードを組み立てることになります)。 – krock
+1興味深いですが、私はまだテストなしでは確信していません。少なくとも2つの@AfterReturningが関わっています:@Transactionalと私のカスタムAspect。 @Transactionalが実行されている場合、すべてのMineが正常に実行されます。しかし、他の順序では、私はトランザクションコミット状態とは独立して前に実行します。 – Justin