我正在实现一个与RabbitMQ中的扇出交换绑定的消费者类,并接收以json发布的消息。出于某种原因,当其参数是自定义对象时,不会调用Consumer类中的handleMessage。当handleMessage更改为使用Object时,相同的代码有效。非常感谢你在身份缺失的帮助下的帮助。
这是配置和消费者类。这不是SpringBoot应用程序。我的Configuration类具有@Configuration注释,而不是@SpringBootApplication。
@Bean
public SimpleMessageListenerContainer messageListenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(rabbitConnectionFactory());
container.setQueueNames(QUEUE_NAME);
container.setMessageListener(listenerAdapter());
container.setMessageConverter(new Jackson2JsonMessageConverter());
container.setMissingQueuesFatal(false);
return container;
}
@Bean
public AmqpAdmin amqpAdmin() {
return new RabbitAdmin(rabbitConnectionFactory());
}
@Bean
public Queue queue() {
return new Queue(QUEUE_NAME, false, false, false);
}
@Bean
public FanoutExchange exchange() {
return new FanoutExchange(EXCHANGE_NAME, false, false);
}
@Bean
public Binding inboundEmailExchangeBinding() {
return BindingBuilder.bind(queue()).to(exchange());
}
@Bean
public ConnectionFactory rabbitConnectionFactory() {
return new CachingConnectionFactory("localhost");
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(rabbitConnectionFactory());
rabbitTemplate.setExchange(EXCHANGE_NAME);
return rabbitTemplate;
}
@Bean
MessageListenerAdapter listenerAdapter() {
return new MessageListenerAdapter(new Consumer(), "receiveMessage");
}
这是消费者......
public class Consumer {
// This works
/*
public void receiveMessage(Object message) {
System.out.println("Received <" + message + ">");
}
*/
// This does not works, whereas I expect this to work.
public void receiveMessage(CustomObject message) {
System.out.println("Received <" + message + ">");
}
}
其中CustomObject类是普通的POJO。
以下是RabbitMQ中发布内容的示例。
{
"state": "stable",
"ip": "1.2.3.4"
}
将其发布为json content-type
exchange.publish(message_json, :content_type => "application/json")
感谢您帮助我理解问题。谢谢。
答案 0 :(得分:0)
需要告诉Jackson2JsonMessageConverter
将json映射到哪个对象。
这可以通过__TypeId__
标题中的信息提供(如果Spring在发送方就是这种情况);标头可以包含完整的类名,也可以包含配置为映射到类名的标记。
或者,您需要使用类映射器配置转换器。
为方便起见,您可以使用目标类配置DefaultClassMapper
:
ClassMapper classMapper = new DefaultClassMapper();
classMapper.setDefaultType(CustomObject.class);
converter.setClassMapper(classMapper);