原文网址:SpringBoot整合RabbitMQ--重试/消息序列化--方法/实例_IT利刃出鞘的博客-CSDN博客
简介
本文用示例介绍SpringBoot整合RabbitMQ时如何进行重试,如何进行消息的序列化。
重试
简介
默认情况下,如果消费者程序出现异常情况, Rabbitmq 会自动实现补偿机制(也就是重试机制)。
@RabbitListener底层使用AOP进行拦截,如果程序没有抛出异常,自动提交事务。 如果Aop使用异常通知拦截获取异常信息的话 , 自动实现补偿机制,该消息会一直缓存在Rabbitmq服务器端进行重放,一直重试到不抛出异常为准。
一般来说默认5s重试一次,可以修改重试策略,消费者配置(重试5次,不行就放弃):
listener:
simple:
retry:
# 开启消费者重试(默认开启)
enabled: true
# 最大重试次数(默认无数次)
max-attempts: 5
# 重试间隔次数
initial-interval: 3000
MessageConvert
简介
- RabbitMQ 的序列化是指 Message 的 body 属性,即我们真正需要传输的内容,RabbitMQ 抽象出一个 MessageConvert 接口处理消息的序列化,其实现有 SimpleMessageConverter(默认)、Jackson2JsonMessageConverter 等。
- 当调用了 convertAndSend 方法时会使用 MessageConvert 进行消息的序列化。
- SimpleMessageConverter 对于要发送的消息体 body 为 byte[] 时不进行处理;若是 String 则转成字节数组;若是 Java 对象,则使用 jdk 序列化将消息转成字节数组,转出来的结果较大,含class类名,类相应方法等信息。因此性能较差。
- 当使用 RabbitMQ 作为中间件时,数据量比较大,此时就要考虑使用类似 Jackson2JsonMessageConverter 等序列化形式以此提高性能。当然,也可以发送端手动将数据转为JSON格式,接收端序列化为指定对象。
使用 JSON 序列化与反序列化
RabbitMQ 提供了 Jackson2JsonMessageConverter 来支持消息内容 JSON 序列化与反序列化。被序列化对象应提供一个无参的构造函数,否则会抛出异常。
消息发送者:设置 MessageConverter 为 Jackson2JsonMessageConverter:
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
消息消费者:配置 MessageConverter 为 Jackson2JsonMessageConverter:
@Configuration
public class RabbitMQConfig {
@Bean
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(
ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
}
自定义序列化
待补充
其他网址
RabbitMQ:@RabbitListener 与 @RabbitHandler 及 消息序列化 - 简书
版权归原作者 IT利刃出鞘 所有, 如有侵权,请联系我们删除。