【问题标题】:Content type different in RabbitListener Spring AMQP using ContentTypeDelegatingMessageConverter使用 ContentTypeDelegatingMessageConverter 在 RabbitListener Spring AMQP 中的内容类型不同
【发布时间】:2020-06-26 02:44:49
【问题描述】:

其实我是用 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

有什么建议吗?

感谢您的帮助。

【问题讨论】:

    标签: java spring spring-boot rabbitmq spring-amqp


    【解决方案1】:

    该模板不用于发送来自@RabbitListeners 的回复;您需要将转换器添加到RabbitListenerContainerFactorySimple...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。

    https://github.com/spring-projects/spring-amqp/issues/1219

    【讨论】:

    • 感谢 Gary 的回复,但我正在使用 ContentTypeDelegatingMessageConverter 创建一个 bean,并且我的 application.yml 中的 Autoconfigure SimpleMessageListenerContainerFactory 正在设置它。我正在使用 Spring AMQP 1.7.4.RELEASE 版本
    • 这是一个错误;我打开了一个问题;您必须告诉框架使用哪个 CT,但它应该可以工作。查看编辑。
    • 感谢 Gary 的回复,我正在使用这些方法,它对我有用。
    • 在代理中是正确的,但目前,标头在调用转换器之后被映射,这意味着委托转换器不知道要使用哪个委托@ 987654322@
    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多