事務下發送MQ問題,改成事務提交後傳送MQ
阿新 • • 發佈:2021-02-10
實際專案中,我們會經常用到MQ,比如RabbitMQ。
通常會遇到一個問題:當在一個開啟事務的方法裡面傳送MQ,經常會遇到事務還沒提交,但是訊息卻已經消費完了。而如果消費者需要用到提交後的資料,則會報錯或出現問題。
解決方案
事務提交後再發送MQ,程式碼如下
AmqpTemplateHelper.java
@Component public class AmqpTemplateHelper { @Autowired private AmqpTemplate amqpTemplate; /** * 事務提交後傳送MQ * @param queue * @param message * @param <T> */ public <T> void send(String queue, T message) { TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { amqpTemplate.convertAndSend(queue, message); } }); } }
使用示例:
@Autowired private AmqpTemplateHelper amqpTemplateHelper; @Transactional(rollbackFor = Throwable.class) public void save() { Person person = new Person(); String id = "123"; person.setId(id); baseMapper.insert(person); amqpTemplateHelper.send("QUEUE_NAME", id); }