1. 程式人生 > 其它 >事務下發送MQ問題,改成事務提交後傳送MQ

事務下發送MQ問題,改成事務提交後傳送MQ

技術標籤:MQ事務MQ事務提交後傳送MQrabbitmq

實際專案中,我們會經常用到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);
    }