前言
不配置这个序列化也行,默认使用jdk自带的序列化机制,容易乱码,效率比较低。
在配置之前,一定要搞确定我们监听队列的模式,是自动确认(ack)还是手动确认(ack),因为两种模式配置序列化有差异的。
序列化
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(converter);
return rabbitTemplate;
}
反序列化
这里就有区别了,注意别弄错了。
- 自动ack模式配置
/**
* 功能描述: 反序列化
* @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;
}
- 手动ack模式配置
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
//如果配置文件中设置了手动确认,这里也必须同步,否则消费端总是会报错并重启
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
return factory;
}
这里有两个容易报的错
1、如果只配置了序列化,没有配置反序列化,会报这个错
No method found for class [B
2、设置了手动确认ack,然而配置类并没有指定手动确认,也就是没有这段配置
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
这时候当你每次收消息的时候都会重启消费者,也就是下边的错误
Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)
Restarting Consumer@64bffd99: tags=[[amq.ctag-GUY1Lga1SqI0_etFwJ8J8A]], channel=Cached Rabbit Channel: AMQChannel(amqp://admin@192.168.25.131:5672/,1), conn: Proxy@46046c06 Shared Rabbit Connection: SimpleConnection@d4df0e [delegate=amqp://admin@192.168.25.131:5672/, localPort= 3938], acknowledgeMode=AUTO local queue size=0
完整配置代码
spring:
rabbitmq:
host: 192.168.25.131
port: 5672
virtual-host: /
#手动ack消息,手动确认消息才算消费
listener:
simple:
acknowledge-mode: manual
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());
//如果配置文件中设置了手动确认,这里也必须同步,否则消费端总是会报错并重启
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
return factory;
}
}