前言
不配置这个序列化也行,默认使用jdk自带的序列化机制,容易乱码,效率比较低。
在配置之前,一定要确认我们有没有用到rbbit的其他功能,比如,消息确认机制或者消费者重试机制等,如果开启了这些配置,那么为了让序列化配置不覆盖掉yml里其他的配置,需要用到其他参数,后边会详细介绍。
不开启rabbit其他功能下的配置方法
序列化
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(converter);
return rabbitTemplate;
}
反序列化
/**
* 功能描述: 反序列化
* @author zhouwenjie
* @date 2022/5/6 1:11
*/
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
常见异常
如果只配置了序列化,没有配置反序列化,会报这个错误
No method found for class [B
完整配置代码
spring:
rabbitmq:
host: 192.168.25.131
port: 5672
virtual-host: /
username: admin
password: 123456
/**
* @author zwj 不配置这个也行,默认使用jdk自带的序列化机制
* @ClassName: RabbitMqConfig
* @company:Joy Trip
*/
@Configuration
public class RabbitMqConfig{
/**
* 功能描述: 序列化
*
* @param connectionFactory
* @return org.springframework.amqp.rabbit.core.RabbitTemplate
* @author zhouwenjie
* @date 2022/5/6 1:11
*/
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(converter);
return rabbitTemplate;
}
/**
* 功能描述: 反序列化
*
* @param
* @return org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory
* @author zhouwenjie
* @date 2022/5/6 1:11
*/
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
}
开启rabbit其他功能下的配置方法
说明
如果开启了rabbit其他功能,比如这些:
如果还是保持上边的序列化配置方法,则一般会出现下边的几种异常。
- 手动确认ack机制总是导致消费端异常重启
这时候当你每次收消息的时候都会重启消费者,也就是下边的错误。
- 确认机制和重试机制不生效
虽然我们在yml里配置开启了这些功能,但是实际测试的时候,怎么都不生效。
那么我们就需要增加参数来配置序列化和这些功能兼容。
1、序列化增加 RabbitTemplateConfigurer
2、反序列化增加 SimpleRabbitListenerContainerFactoryConfigurer
完整代码
/**
* @author zwj 不配置这个也行,默认使用jdk自带的序列化机制
* @ClassName: RabbitMqConfig
* @company:Joy Trip
*/
@Configuration
@EnableConfigurationProperties(RabbitProperties.class)
public class RabbitMqConfig{
/**
* 功能描述: 序列化
*
* @param connectionFactory
* @return org.springframework.amqp.rabbit.core.RabbitTemplate
* @author zhouwenjie
* @date 2022/5/6 1:11
*/
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, RabbitTemplateConfigurer rabbitTemplateConfigurer) {
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setMessageConverter(converter);
rabbitTemplateConfigurer.configure(rabbitTemplate,connectionFactory);
return rabbitTemplate;
}
/**
* 功能描述: 反序列化
*
* @param
* @return org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory
* @author zhouwenjie
* @date 2022/5/6 1:11
*/
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer factoryConfigurer,ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setMessageConverter(new Jackson2JsonMessageConverter());
factoryConfigurer.configure(factory,connectionFactory);
return factory;
}
}
这样之后,不管开启什么功能,这里都不用动,完全兼容,网上基本上都是本文的第一种配置方法,经过实践之后,推荐使用第二种方法进行序列化的配置。