一、Spring Boot整合RabbitMQ事务消息机制
注释application.yml中配置的消息确认机制,因为使用事务消息机制,不能同时使用消息确认机制
spring:
rabbitmq:
host: 127.0.0.1
port: 7006
username: admin
password: admin
# 是否触发回调方法
# NONE值是禁用发布确认模式,是默认值
# CORRELATED值是发布消息成功到交换器后会触发回调方法,如1示例
# SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;
# publisher-confirm-type: correlated
注册RabbitMQ事务管理器
package com.cyun.demo.rabbitmq.provider.config;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* RabbitMQ配置类
*
* @author He PanFu
* @date 2022-04-18 19:16:52
*/
@Configuration
public class RabbitmqConfig {
/**
* 注册rabbitmq事务管理器
*
* @param connectionFactory 连接工厂
* @param rabbitTemplate rabbit模板
* @return rabbitmq事务管理器
*/
@Bean
public RabbitTransactionManager rabbitTransactionManager(CachingConnectionFactory connectionFactory, RabbitTemplate rabbitTemplate) {
// channel开启事务支持
rabbitTemplate.setChannelTransacted(true);
return new RabbitTransactionManager(connectionFactory);
}
}
发送者发送消息:需使用@Transactional(rollbackFor = Exception.class)事务注解
@GetMapping("/direct/wx/transactional")
@Transactional(rollbackFor = Exception.class)
public String sendDirectMessageTransactional() {
rabbitTemplate.convertAndSend("direct_exchange", "wx", getStringObjectMap());
log.info("开启事务消息机制");
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
return "ok";
}
结果展示:消费者收到消息和发送者发出消息间隔了5s
参考链接:
Spring Boot整合RabbitMQ——生产者发送确认