Должно ли изображение быть в кодировке 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(...);,

Другие вопросы по тегам