使用Spring Boot和事务的订单方法调用MQ修改库存时,可能会出现事务未提交但MQ先消费的情况。要解决这个问题,可以使用TransactionEventListener来监听事务的提交事件,并在事务提交后再发送MQ消息。

首先,创建一个实现TransactionEventListener接口的类,例如TransactionEventListenerImpl:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

@Component
public class TransactionEventListenerImpl implements TransactionEventListener {

    @Override
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void onTransactionCommit(TransactionPhase transactionPhase) {
        // 在事务提交后执行MQ消息的发送
        sendMqMessage();
    }

    private void sendMqMessage() {
        // 发送MQ消息的逻辑
    }
}

在TransactionEventListenerImpl类中,我们使用@TransactionalEventListener注解来标记该方法是一个事务事件监听器,并指定监听的阶段为AFTER_COMMIT,即事务提交后。

在sendMqMessage方法中,编写发送MQ消息的逻辑。

接下来,在需要调用MQ修改库存的订单方法上,使用@Transactional注解开启事务:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

    @Autowired
    private TransactionEventListenerImpl transactionEventListener;

    @Transactional
    public void updateOrderAndSendMqMessage() {
        // 修改订单逻辑

        // 事务提交后发送MQ消息
        transactionEventListener.sendMqMessage();
    }
}

在上述示例中,我们将TransactionEventListenerImpl实例注入到OrderService中,并在updateOrderAndSendMqMessage方法中手动调用transactionEventListener的sendMqMessage方法来发送MQ消息。

这样,当订单方法的事务提交后,TransactionEventListenerImpl中的onTransactionCommit方法会被触发,然后执行sendMqMessage方法来发送MQ消息,保证了事务提交后再发送MQ消息的顺序。

SpringBoot事务与MQ消费顺序问题解决:使用TransactionEventListener监听事务提交

原文地址: http://www.cveoy.top/t/topic/pbZS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录