SpringBoot整合RabbitMQ--重试/消息序列化--方法/实例

原文网址: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

简介

  1. RabbitMQ 的序列化是指 Message 的 body 属性,即我们真正需要传输的内容,RabbitMQ 抽象出一个 MessageConvert 接口处理消息的序列化,其实现有 SimpleMessageConverter默认)、Jackson2JsonMessageConverter 等。
  2. 当调用了 convertAndSend 方法时会使用 MessageConvert 进行消息的序列化。
  3. SimpleMessageConverter 对于要发送的消息体 body 为 byte[] 时不进行处理;若是 String 则转成字节数组;若是 Java 对象,则使用 jdk 序列化将消息转成字节数组,转出来的结果较大,含class类名,类相应方法等信息。因此性能较差。
  4. 当使用 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 及 消息序列化 - 简书

猜你喜欢

转载自blog.csdn.net/feiying0canglang/article/details/125071875