将@RabbitListener与Jackson2JsonMessageConverter一起使用(Using @RabbitListener with Jackson2JsonMessageConv

编程入门 行业动态 更新时间:2024-10-06 10:26:46
将@RabbitListener与Jackson2JsonMessageConverter一起使用(Using @RabbitListener with Jackson2JsonMessageConverter)

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

I have spent the last little while trying to get it so that my handler that is registered using @RabbitListener will have the message converted with the Jackson2JsonMessageConverter. Unfortunately no matter what configuration setup I try only the SimpleMessageConverter is used.

@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); } }

This is the config I have currently that I think is closest to what is documented:

@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"); } }

What I understand so far, which is where I am stuck, is that RabbitTemplate is used when sending a message from the application to RabbitMQ. As such I sort of understand why my custom MessageConverter is not being used for the Handler invocation. Unfortunately I don't see how to set the MessageConverter on the incoming side. How do I use the MessageConverter that I have configured with the incoming messages?

最满意答案

请参阅有关如何配置为带注释的端点创建的侦听器容器的文档 :

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

See the documentation about how to configure the listener containers created for annotated endpoints:

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

更多推荐

本文发布于:2023-07-27 08:27:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1287725.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:RabbitListener   Jackson2JsonMessageConverter

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!