Должно ли изображение быть в кодировке base64 в сообщении JSON или возвращено как BytesMessage в Spring AMQP?
Я настроил базовый обмен запросами / ответами через Spring amqp с использованием POJO, и они обмениваются через RabbitMQ через конвертер сообщений JSON.
До сих пор полезная нагрузка моего ответа 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 как- в других случаях?
1 ответ
Два таких слушателя не сработают - они просто создадут двух конкурирующих потребителей в одной очереди. Одним из решений было бы использование разных очередей (и разных слушателей).
Если вы хотите использовать одну и ту же очередь для обоих типов запросов, возможно, самое простое решение - вернуть POJO прослушивателя. Object
(POJO или byte[]
) (Q2b) и используйте кастом MessageConverter
,
Пользовательский messageConverter будет довольно простым; при условии, что вы всегда получаете JSON на входящем, он всегда делегирует JsonMessageConverter
в fromMessage()
и на исходящей стороне (toMessage
) следует делегировать либо JsonMessageConverter
или 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(...);
,