前提
如果消息发送和本地事务在同一个@Transactional注解下,
如何保证本地事务结束才发送MQ消息?
@Transactional
public void save() {
1. 本地事务
2. 发MQ;
}
注意:MQ一定要在本地事务后面
解决方案如下
@Component
public class MQTransactionHelper {
@Autowired
private MqTemplate MqTemplate;
public <T> void send(String queue, T message) {
// 是否开启事务判断
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
mqTemplate.send(message);
}
});
} else {
mqTemplate.send(message);
}
}
}
网友评论