我花了最后一小段时间尝试获取它,以便我使用@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; }更多推荐
发布评论