请使用 Spring AMQP 4.0.2(最新稳定版本)!spring-doc.cadn.net.cn

回复内容类型

如果您正在使用一种复杂的消息转换器(例如 ContentTypeDelegatingMessageConverter),您可以通过设置监听器上的 replyContentType 属性来控制回复的内容类型。这使得转换器能够为回复选择适当的委托转换器。spring-doc.cadn.net.cn

@RabbitListener(queues = "q1", messageConverter = "delegating",
        replyContentType = "application/json")
public Thing2 listen(Thing1 in) {
    ...
}

默认情况下,为保持向后兼容性,任何由转换器设置的内容类型属性在转换后都会被此值覆盖。例如,SimpleMessageConverter 这类转换器会使用响应类型而非内容类型来确定所需的转换,并相应地在响应消息中设置内容类型。这可能并非期望的操作,可通过将 converterWinsContentType 属性设置为 false 来覆盖。例如,如果您返回一个包含 JSON 的 String,则 SimpleMessageConverter 会将响应中的内容类型设置为 text/plain。以下配置可确保即使使用了 SimpleMessageConverter,内容类型也能被正确设置。spring-doc.cadn.net.cn

@RabbitListener(queues = "q1", replyContentType = "application/json",
        converterWinsContentType = "false")
public String listen(Thing in) {
    ...
    return someJsonString;
}

这些属性(replyContentTypeconverterWinsContentType)在返回类型为 Spring AMQP Message 或 Spring Messaging Message<?> 时无效。在第一种情况下,不涉及转换;只需设置 contentType 消息属性即可。在第二种情况下,行为通过消息头进行控制:spring-doc.cadn.net.cn

@RabbitListener(queues = "q1", messageConverter = "delegating")
@SendTo("q2")
public Message<String> listen(String in) {
    ...
    return MessageBuilder.withPayload(in.toUpperCase())
            .setHeader(MessageHeaders.CONTENT_TYPE, "application/xml")
            .build();
}

此内容类型将作为 MessageProperties 传递给转换器。
默认情况下,为保持向后兼容性,转换器设置的任何内容类型属性将在转换后被此值覆盖。
如果您希望覆盖该行为,请同时将 AmqpHeaders.CONTENT_TYPE_CONVERTER_WINS 设置为 true,这样转换器设置的任何值都将被保留。spring-doc.cadn.net.cn