我在收到RabbitMQ的消息时遇到了问题 . 我正在发送如下信息
HashMap<Object, Object> senderMap=new HashMap<>();
senderMap.put("STATUS", "SUCCESS");
senderMap.put("EXECUTION_START_TIME", new Date());
rabbitTemplate.convertAndSend(Constants.ADAPTOR_OP_QUEUE,senderMap);
如果我们在RabbitMQ中看到,我们将获得一个完全限定的类型 .
In the current scenario, we have n number of producer for the same consumer. If i use any mapper, it leads to an exception. How will i send a message so that it doesn't contain any type_id and i can receive the message as Message object and later i can bind it to my custom object in the receiver.
我收到的消息如下 . 你能告诉我如何使用 Jackson2MessageConverter ,这样消息就会直接从Receiver端绑定到我的Object / HashMap . 此外,我现在已从发件人中删除了Type_ID .
消息在RabbitMQ中的显示方式
priority:0 delivery_mode:2个头:ContentTypeId:java.lang.Object KeyTypeId:java.lang.Object content_encoding:UTF-8 content_type:application / json {“Execution_start_time”:1473747183636,“status”:“SUCCESS”}
@Component
public class AdapterOutputHandler {
private static Logger logger = Logger.getLogger(AdapterOutputHandler.class);
@RabbitListener(containerFactory="adapterOPListenerContainerFactory",queues=Constants.ADAPTOR_OP_QUEUE)
public void handleAdapterQueueMessage(HashMap<String,Object> message){
System.out.println("Receiver:::::::::::"+message.toString());
}
}
连接
@Bean(name="adapterOPListenerContainerFactory")
public SimpleRabbitListenerContainerFactory adapterOPListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
DefaultClassMapper classMapper = new DefaultClassMapper();
messageConverter.setClassMapper(classMapper);
factory.setMessageConverter(messageConverter);
}
例外
Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to convert Message content. Could not resolve __TypeId__ in header and no defaultType provided
at org.springframework.amqp.support.converter.DefaultClassMapper.toClass(DefaultClassMapper.java:139)
I don't want to use __TYPE__ID from sender because they are multiple senders for the same queue and only one consumer.
2 回答
有什么例外?
这意味着您正在发送DTO,而不是您在问题中描述的哈希映射 .
如果要删除typeId标头,可以使用消息后处理器...
(或
, new MessagePostProcessor() {...}
如果您不使用Java 8) .EDIT
您使用的是什么版本的Spring AMQP?使用1.6,您甚至不必删除
__TypeId__
标头 - 框架查看侦听器参数类型并告诉Jackson转换器类型,以便它自动转换为(如果可以) . 正如你在这里看到的那样;它没有删除类型ID工作正常...结果:
这在the documentation中有描述......
您还可以将自定义
ClassMapper
配置为始终返回HashMap
.使用自定义ClassMapper配置@Bean Jackson2JsonMessageConverter
提供自定义@Bean
Converter
,ConversionService
,RabbitListenerAnnotationBeanPostProcessor
:参考文献:
Jackson2JsonMessageConverter
AMQP-461
调试源代码PayloadArgumentResolver