Rabbit下载和安装
在win10系统安装RabbitMq是需要erlang环境的,选择安装目录一直下一步就行了
链接: https://pan.baidu.com/s/1qM5N7bqOwoIg0ckw4vtzuA
提取码: fc8h
安装完成之后可以看到如下信息,然后启动服务访问 http://localhost:15672 便可看到可视化控制台,默认账号密码都是 guest
spring boot快速集成RabbitMq
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
yaml配置
spring:
rabbitmq:
host: localhost
port: 5672
publisher-returns: true
publisher-confirm-type: correlated #确认机制类型
#publisher-confirms: true 改用上面配置
listener:
simple:
acknowledge-mode: manual #ack为手动应答方式
retry:
max-attempts: 3 #重试最大次数
enabled: true #开启重试
不要忘记在Spring boot上面加上 @EnableRabbit 注解
RabbitMq 相关配置(可能出现循环依赖问题和Java)
@Configuration
public class RabbitConfiguration {
/**
* 配置消息转换器
* @return
*/
@Bean
public MessageConverter getMessageConverter(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
return new Jackson2JsonMessageConverter(objectMapper);
}
/*
出现 Java 8 date/time type `java.time.LocalDateTime` 异常
@Bean
public MessageConverter getMessageConverter() {
return new Jackson2JsonMessageConverter();
}*/
//此处不配置Rabbit callBack回调是因为会出现循环依赖问题
}
Rabbit Mq发送端确认机制回调处理
@Component
public class RabbitCallbackConfiguration {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 定制RabbitTemplate
* 服务收到消息就回调ConfirmCallback
*/
@PostConstruct
public void initRabbitTemplate() {
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/**
* 1、只要消息抵达Broker就ack=true 服务器收到了
*
* @param correlationData 当前消息的唯一关联数据
* @param ack 消息是否成功收到
* @param cause 失败原因
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
/**
* 1、做好消息确认机制(publisher,consumer【手动ack】)
* 2、每一个发送的消息都在数据库做好记录,定期将失败的消息再次发送
*/
if (!ack) {
System.out.println("correlationData【" + correlationData + "】===>ack【" + ack + "】===>cause【" + cause + "】");
}
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
/**
* 只要消息没有投递给指定的队列,就会触发这个失败回调
* @param message 投递失败的消息详细信息
* @param replyCode 回复的状态码
* @param replyText 回复的文本内容
* @param exchange 当时这个消息发给那个交换机
* @param routingKey 当时这个消息用哪个路由键
*/
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("message【" + message + "】===>replyCode【" + replyCode + "】===>replyText【" + replyText + "】===》exchange【" + exchange + "】===》routingKey【" + routingKey + "】");
}
});
}
}
Rabbit Mq发送消息和接收消息
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendUserAccountData() {
//交换机 - routingKey - 消息
rabbitTemplate.convertAndSend("sourceUserDataExchange", "userKey", "hello Wold");
}
@Component
public class SourceUserAccountDataListener {
@RabbitListener(queues = "队列")
public void userAccountListener(JssdmallUserAccount jssdmallUserAccount, Channel channel, Message message) {
try {
//相关业务处理
//手动Ack应答处理
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
try {
//手动Ack应答处理,重新回队列
channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
关于Spring boot 2.6.3集成 RabbitMq 消息转换器配置和发送端回调处理踩坑点以上解决思路。