用spring动态注册事务监听器?

Jus*_*tin 12 spring transactions jta

我有一个springframework应用程序,我想在其中添加一个事务监听器到当前正在进行的事务.动机是触发通知下游系统的提交后动作.我正在使用@Transactional围绕某个服务方法包装事务 - 这是我想要创建/注册事务监听器的地方.我想做一些"喜欢"以下的事情.

public class MyService {
 @Transaction
 public void doIt() {
  modifyObjects();

  // something like this
  getTransactionManager().registerPostCommitAction(new 
   TransactionSynchronizationAdapter() {
     public void afterCommit() { 
      notifyDownstream(); 
     }
  });
 }
}
Run Code Online (Sandbox Code Playgroud)

Spring有一个TransactionSynchronization接口和适配器类,它看起来正是我想要的; 但是,如何使用当前事务或事务管理器动态注册一个,并不是很明确.如果我可以避免它,我宁愿不继承JtaTransactionManager的子类.

问:有没有人这样做过.

问:注册我的适配器最简单的方法是什么?

Jus*_*tin 29

实际上它没有我想象的那么难; spring有一个静态助手类,它将"正确"的东西放入线程上下文中.

TransactionSynchronizationManager.registerSynchronization(
    new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
            s_logger.info("TRANSACTION COMPLETE!!!");
        }
    }
);
Run Code Online (Sandbox Code Playgroud)


kro*_*ock 3

您可以使用一个方面来匹配服务中的事务方法方面来完成此操作:

@Aspect
public class AfterReturningExample {

  @AfterReturning("execution(* com.mypackage.MyService.*(..))")
  public void afterReturning() {
    // ...
  }

}
Run Code Online (Sandbox Code Playgroud)