Spring-Rabbitmq MessageConverter - 不调用自定义对象handleMessage

时间:2018-03-16 21:38:40

标签: spring spring-rabbitmq

我正在实现一个与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")

感谢您帮助我理解问题。谢谢。

1 个答案:

答案 0 :(得分:0)

需要告诉Jackson2JsonMessageConverter将json映射到哪个对象。

这可以通过__TypeId__标题中的信息提供(如果Spring在发送方就是这种情况);标头可以包含完整的类名,也可以包含配置为映射到类名的标记。

或者,您需要使用类映射器配置转换器。

为方便起见,您可以使用目标类配置DefaultClassMapper

ClassMapper classMapper = new DefaultClassMapper();
classMapper.setDefaultType(CustomObject.class);
converter.setClassMapper(classMapper);