对于最新的稳定版本,请使用 Spring AMQP 3.2.6! |
回复 ContentType
如果您使用的是复杂的消息转换器,例如ContentTypeDelegatingMessageConverter
,您可以通过设置replyContentType
属性。这允许转换器为回复选择适当的委托转换器。
@RabbitListener(queues = "q1", messageConverter = "delegating",
replyContentType = "application/json")
public Thing2 listen(Thing1 in) {
...
}
默认情况下,为了向后兼容,转换器设置的任何内容类型属性在转换后都将被此值覆盖。转换器,例如SimpleMessageConverter
使用回复类型而不是内容类型来确定所需的转换,并在回复消息中适当设置内容类型。这可能不是所需的作,可以通过设置converterWinsContentType
属性设置为false
. 例如,如果您返回String
包含 JSON,则SimpleMessageConverter
会将回复中的内容类型设置为text/plain
. 以下配置将确保内容类型设置正确,即使SimpleMessageConverter
被使用。
@RabbitListener(queues = "q1", replyContentType = "application/json",
converterWinsContentType = "false")
public String listen(Thing in) {
...
return someJsonString;
}
这些属性 (replyContentType
和converterWinsContentType
) 不适用当返回类型为 Spring AMQP 时Message
或 Spring MessagingMessage<?>
. 在第一种情况下,不涉及转换;只需将contentType
message 属性。在第二种情况下,使用消息头控制行为:
@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
转换器设置的任何值都将被保留。