Spring 提供了事务同步管理器让我们能监听Spring的事务操作,
TransactionSynchronizationManager.isSynchronizationActive()
这个可以获取到当前是否存在事务,
TransactionSynchronizationManager.registerSynchronization()
这是注册一个监听器,需要传入一个对象TransactionSynchronization
他有两个方法
@Override
public void afterCommit() {
...
}
public void afterCompletion(int status) {
...
}
一个是事务提交后执行,一个是事务完成后执行(不会区分他是提交还是回滚操作)
下面提供一个工具类可以参考
package com.bitsun.oms.ops.pubsub;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import oracle.jdbc.babelfish.TranslationManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import java.util.Objects;
@Slf4j
@Component
public class EventPublisher {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void send(ApplicationEvent event) {
if (Objects.isNull(event)) {
return;
}
log.info("{} published: {}", event.getClass().getSimpleName(), JSON.toJSONString(event.getSource()));
applicationEventPublisher.publishEvent(event);
}
/**
* 事务提交后执行
* @param event
*/
public void sendAfterCommit(ApplicationEvent event) {
//当前存在事务,在事务提交后执行
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
send(event);
}
});
} else {
//当前不存在事务,直接执行
send(event);
}
}
/**
* 事务完成后执行,不区分事务是否提交还是回滚
*
* @param event
*/
public void sendAfterCompletion(ApplicationEvent event) {
//当前存在事务,在事务完成后执行
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCompletion(int status) {
send(event);
}
});
} else {
//当前不存在事务,直接执行
send(event);
}
}
}