SpringBoot事务与MQ消费顺序问题解决:使用TransactionEventListener监听事务提交
使用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消息的顺序。
原文地址: http://www.cveoy.top/t/topic/pbZS 著作权归作者所有。请勿转载和采集!