将@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?
请参阅the documentation了解如何配置为带注释的端点创建的侦听器容器:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(rabbitConnectionFactory());
factory.setMessageConverter(messageConverter());
return factory;
}
我在尝试获取它时花费了最后一点时间,以便使用@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;
}