简介

本文用示例介绍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 及 消息序列化 - 简书​

android studio中hint androidstudio中hint怎么改颜色

2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android” 3. android:orientation=“vertical” 4. android:layout_width=“fill_parent” 5. android:layout_height=“fill_parent”

sql server 检测到基于一致性的逻辑i/o错误 pageid 检查sql

SELECT SUBSTRING(ST.text, ( QS.statement_start_offset / 2 ) + 1, ( ( CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text)