0

我已经使用 POJO 通过 spring amqp 设置了基本的请求/回复消息,这些通过 JSON 消息转换器在 RabbitMQ 上交换。

到目前为止,我的响应 pojo 的有效负载是简单的字符串,但现在我有时也需要用图像回复。

Q1) 处理此问题的最佳方法是什么?图像是否应该被 base64 编码为 JSON 消息的有效负载字符串?

Q2)是否可以简单地将图像作为 BytesMessage 返回?

Q2.a) spring-amqp 是否能够处理两个单独的侦听器,一个返回 POJO,另一个返回 BytesMessage?我不这么认为,但这里有一些关于我要问的伪代码:

<listener-container>
    <listener ref="requestHandlerA" method="handleMessage" queue-names="#{requestQueue.name}" />
    <listener ref="requestHandlerB" method="handleMessage" queue-names="#{requestQueue.name}" />
</listener-container>

public class RequestHandlerA {
    public ResponseDelegatePojo handleMessage(RequestDelegatePojo requestDelegate) {...}
}
public class RequestHandlerB {
    public BytesMessage handleMessage(RequestDelegatePojo requestDelegate) {...}
}

Q2.b) 或者...如果 MessageListener 返回一个对象(有时可能是 POJO,有时可能是 BytesMessage)... spring-amqp 框架是否能够在运行时进行相应调整以发送回序列化的 POJO有时作为 json 和其他时间的BytesMessage

4

1 回答 1

1

两个这样的监听器是行不通的——它只会在同一个队列上创建两个竞争的消费者。一种解决方案是使用不同的队列(和不同的侦听器)。

如果您想对两种请求类型使用相同的队列,最简单的解决方案可能是让您的侦听器 POJO 返回Object(POJO 或byte[])(Q2b)并使用自定义的MessageConverter.

自定义 messageConverter 将非常简单;假设您总是在入站获得 JSON,它总是会委托给 a JsonMessageConverterinfromMessage()并且在出站端 ( toMessage) 应该委托给 aJsonMessageConverter或 a SimpleMessageConverter

if (object instanceof byte[]) {
    return this.simpleMessageConverter.toMessage(object, messageProperties);
else {
    return this.jsonMessageConverter.toMessage(object, messageProperties);
}

SimpleMessageConverter会将contentType属性设置为,application/octet-stream但您可以在调用其toMessage方法 ( message.getMessageProperties().setContentType(...);.

于 2013-06-23T08:08:26.887 回答