【问题标题】:Using @RabbitListener with Jackson2JsonMessageConverter将 @RabbitListener 与 Jackson2JsonMessageConverter 一起使用
【发布时间】:2015-03-30 02:37:08
【问题描述】:

我花了最后一点时间尝试获取它,以便使用@RabbitListener 注册的处理程序将使用Jackson2JsonMessageConverter 转换消息。不幸的是,无论我尝试什么配置设置,都只使用了 SimpleMessageConverter。

@Component
@Slf4j
public class TestQueueListener {
    @RabbitListener(queues = "#{@allQueue}")
    public void processMessage(String data) {
        log.trace("Message received: {}", data);
    }

    @RabbitListener(queues = "#{@invokeQueue}")
    public void processSpawnInstanceMessage(TestConfig config) {
        log.trace("Invoking with config: {}", config);

        invokeSomeMethod(config);
    }
}

这是我目前拥有的配置,我认为最接近记录的内容:

@Configuration
@EnableRabbit
public class MessagingConfiguration {
    @Bean
    public MessageConverter messageConverter() {
        ContentTypeDelegatingMessageConverter messageConverter = new ContentTypeDelegatingMessageConverter();
        messageConverter.addDelgate("application/json", new Jackson2JsonMessageConverter());
        return messageConverter;
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(messageConverter);
        return rabbitTemplate;
    }

    @Bean
    public TopicExchange testExchange() {
        return new TopicExchange("test");
    }

    @Bean
    public Queue allQueue() {
        return new Queue("all", false, true, true);
    }

    @Bean
    public Binding allBinding(TopicExchange testExchange, Queue allQueue) {
        return BindingBuilder.bind(allQueue).to(testExchange).with("*");
    }

    @Bean
    public Queue invokeQueue() {
        return new Queue("invoke", false, true, true);
    }

    @Bean
    public Binding invokeBinding(TopicExchange testExchange, Queue invokeQueue) {
        return BindingBuilder.bind(invokeQueue).to(testExchange).with("invoke");
    }
}

到目前为止,我的理解是,在从应用程序向 RabbitMQ 发送消息时使用了 RabbitTemplate。因此,我有点理解为什么我的自定义 MessageConverter 没有用于 Handler 调用。不幸的是,我看不到如何在传入端设置 MessageConverter。如何使用我为传入消息配置的 MessageConverter?

【问题讨论】:

    标签: spring-amqp


    【解决方案1】:

    请参阅the documentation,了解如何配置为带注释的端点创建的侦听器容器:

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(rabbitConnectionFactory());
        factory.setMessageConverter(messageConverter());
        return factory; 
    }
    

    【讨论】:

    • 我曾多次阅读该文档,甚至有一次记得实现了您列出的该方法,但它似乎不起作用。刚才又试了一次,效果很好。现在通过 classMapper 工作,因为我的客户不会在标题中提供类类型。
    • 刚刚也偶然发现了 ClassMapper 依赖项 - 您是如何解决这个问题的?
    猜你喜欢
    • 2021-07-13
    • 2016-01-19
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多