spring-amqp - 将 @RabbitListener 与 Jackson2JsonMessageConverter 一起使用

标签 spring-amqp

我花了最后一点时间尝试获取它,以便我使用@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?

最佳答案

the documentation关于如何配置为带注释的端点创建的监听器容器:

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

关于spring-amqp - 将 @RabbitListener 与 Jackson2JsonMessageConverter 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29337550/

相关文章:

java - 如何在 Spring-AMQP 中使用 Jackson2JsonMessageConverter 处理内容类型 null

java - 使用 spring 的 Rabbitmq 集群在故障转移后不会进行故障恢复

java - Spring AMQP - 在启动时将队列注册到容器的正确方法

java - 异步 Spring 远程处理 (AMQP) 客户端

java - 在运行时使用 SmartLifecycle 添加队列时出现问题

spring-amqp - 在 spring-webflux 中使用 Spring AMQP 消费者

Spring AMQP 异常处理基础知识

java - Spring 集成 pubsub 与 Spring amqp RabbitMQ pubsub

java - Spring boot standalone CommandLineRunner 不会返回 spring-starter-amqp

spring - 使用 RabbitTemplate 或 AmqpTemplate 哪一个?