0
点赞
收藏
分享

微信扫一扫

rabbitmq消息序列化与反序列化配置

westfallon 2022-05-06 阅读 80
rabbitmq

前言

不配置这个序列化也行,默认使用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;
    }
}
举报

相关推荐

0 条评论