使用 ContentTypeDelegatingMessageConverter 的 RabbitListener Spring AMQP 中的内容类型不同
Content type different in RabbitListener Spring AMQP using ContentTypeDelegatingMessageConverter
实际上我正在使用 Spring AMQP 从 Rabbit 使用 XML。
这是我的监听队列代码。
@RabbitListener(queues = DealerReceiverConfig.P8_QUEUE_NAME, id = Constants.P8_QUEUE_ID)
@SendTo("foo.bar")
public RequestDocument p8ContentReceiveMessage(RequestDocument request) {
System.out.println(request.getCorrelationId());
return request;
}
我的兔子模板配置是:
@Override
@Bean(name = "dealerRabbit")
public RabbitTemplate rabbitTemplateSeguros(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(producerMessageConverter());
return template;
}
@Override
@Bean
public MessageConverter producerMessageConverter() {
ContentTypeDelegatingMessageConverter messageConverter = new ContentTypeDelegatingMessageConverter();
Jackson2JsonMessageConverter jsonMessageConverter = new Jackson2JsonMessageConverter();
messageConverter.addDelegate("application/json", jsonMessageConverter);
MarshallingMessageConverter marshaller = new MarshallingMessageConverter();
marshaller.setMarshaller(oxmMarshaller());
marshaller.setUnmarshaller(oxmUnMarshaller());
messageConverter.addDelegate("application/xml", marshaller);
return messageConverter;
}
@Bean
public Marshaller oxmMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("foo.bar.model");
return marshaller;
}
@Bean
public Unmarshaller oxmUnMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("foo.bar.model");
return marshaller;
}
问题是当我在配置的@SentTo 队列中看到返回的消息时,我收到以下消息。
Returned message
有什么建议吗?
感谢您的帮助。
该模板不用于发送来自 @RabbitListener
的回复;您需要将转换器添加到 RabbitListenerContainerFactory
(Simple...
或 Direct...
,具体取决于您使用的容器类型)。
编辑
这是一个错误;你应该能够做到这一点...
@RabbitListener(queues = "foo")
@SendTo("bar")
public Message<String> listen(String in) {
System.out.println(in);
return MessageBuilder.withPayload(in.toUpperCase())
.setHeader(MessageHeaders.CONTENT_TYPE, "application/xml")
.build();
}
但适配器仍使用原始 MessageProperties
,其中 application/x-java-serialized-object
作为默认 CT。
实际上我正在使用 Spring AMQP 从 Rabbit 使用 XML。
这是我的监听队列代码。
@RabbitListener(queues = DealerReceiverConfig.P8_QUEUE_NAME, id = Constants.P8_QUEUE_ID)
@SendTo("foo.bar")
public RequestDocument p8ContentReceiveMessage(RequestDocument request) {
System.out.println(request.getCorrelationId());
return request;
}
我的兔子模板配置是:
@Override
@Bean(name = "dealerRabbit")
public RabbitTemplate rabbitTemplateSeguros(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(producerMessageConverter());
return template;
}
@Override
@Bean
public MessageConverter producerMessageConverter() {
ContentTypeDelegatingMessageConverter messageConverter = new ContentTypeDelegatingMessageConverter();
Jackson2JsonMessageConverter jsonMessageConverter = new Jackson2JsonMessageConverter();
messageConverter.addDelegate("application/json", jsonMessageConverter);
MarshallingMessageConverter marshaller = new MarshallingMessageConverter();
marshaller.setMarshaller(oxmMarshaller());
marshaller.setUnmarshaller(oxmUnMarshaller());
messageConverter.addDelegate("application/xml", marshaller);
return messageConverter;
}
@Bean
public Marshaller oxmMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("foo.bar.model");
return marshaller;
}
@Bean
public Unmarshaller oxmUnMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("foo.bar.model");
return marshaller;
}
问题是当我在配置的@SentTo 队列中看到返回的消息时,我收到以下消息。
Returned message
有什么建议吗?
感谢您的帮助。
该模板不用于发送来自 @RabbitListener
的回复;您需要将转换器添加到 RabbitListenerContainerFactory
(Simple...
或 Direct...
,具体取决于您使用的容器类型)。
编辑
这是一个错误;你应该能够做到这一点...
@RabbitListener(queues = "foo")
@SendTo("bar")
public Message<String> listen(String in) {
System.out.println(in);
return MessageBuilder.withPayload(in.toUpperCase())
.setHeader(MessageHeaders.CONTENT_TYPE, "application/xml")
.build();
}
但适配器仍使用原始 MessageProperties
,其中 application/x-java-serialized-object
作为默认 CT。