在工作中,遇到的一个问题,记录一下!如果觉得有用,麻烦点个赞~谢谢
注意:
如果在服务方配置了则程序会走自动确认消费,配置文件的配置就不生效了(Spring boot在整合rabbit mq的时候,它会自动给你创建simpleRabbitListenerContainerFactory这样的一个类,如果用@bean构建了,那么它就不去创建了。所以写的那些配置它也不会加载。)
使用 JSON 序列化与反序列化(服务方配置)
-
RabbitMQ 提供了 Jackson2JsonMessageConverter 来支持消息内容 JSON 序列化与反序列化
-
消息服务者在服务消息时应设置 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;
}}
那么你再使用提交ack机制的时候
//提交单条消息 channel.basicAck(deliveryTag,false);
就会出现如下 错误:
第一条:
表明这条消息对于MQ来说没找到,重点是这个---unknown delivery tag 1-参考rabbitMQ的tag机制可知这条消息已经完成了消费。
com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)
第二条 :
表明这条消息被一个设置为自动确认的任务给确认了,意思就是 你配置的手动ack变成了自动ack!
Restarting Consumer: tags=[{amq.ctag-zms15dchTPRiv8SH2W0_8Q=videoChange}], channel=Cached Rabbit Channel: AMQChannel(amqp://admin@59.110.229.19:5672/,2), conn: Proxy@131c5bd Shared Rabbit Connection: SimpleConnection@3a500321 [delegate=amqp://admin@59.110.229.19:5672/, localPort= 50032], acknowledgeMode=AUTO local queue size=0
这个问题解决办法就是把所有的配置信息用代码设置,例如我们的手动确认ack机制。就OK了
@Bean
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); //设置手动ack
return factory;
}