Невозможно изменить content_type с application / octet-stream на application / json в приемнике RabbitMQ - PullRequest
1 голос
/ 10 апреля 2019

У меня есть простой источник и приемник RabbitMQ.Я публикую сообщение в исходной очереди со следующими свойствами:

content_type -> application/json

и полезной нагрузкой JSON:

{
  "userId": 2,
  "customerId": 1,
}

Приемник RabbitMQ получает сообщение с application/octet-stream вместоJSON.

Я пытался запустить приложение со следующими свойствами:

spring.cloud.stream.default.contentType=application/json

, но это не помогло.

Определение потока:

stream_1=rabbitSource: rabbit --queues=queue1 --password=p --host=h --username=u | sink: rabbit --exchange=ex --routing-key=rk --converter-bean-name=jsonConverter --password=p --host=h --username=u

Как установить тип содержимого на application/json?Справочное руководство , похоже, не имеет ответа.

Версии выпуска:

  • spring-cloud-dataflow-server: 2.0.1.RELEASE
  • spring-cloud-skipper-server: 2.0.0.RELEASE

Обновление:

Как подсказано в ответах @SabbyAnandan, я сейчас работаю:

dataflow:>stream create --name test123 --definition "rabbitSource: rabbit --queues=queue --password=p --host=rmq --username=u --spring.cloud.stream.bindings.output.contentType='application/json' | sink: rabbit --exchange=ex --routing-key=rk --converter-bean-name=jsonConverter --password=p --host=rmq --username=p"
Created new stream 'test123123'

dataflow:>stream deploy --name test123 --properties "app.rabbit.spring.cloud.stream.bindings.output.contentType='application/json'"
Deployment request has been sent for stream 'test123'

Но content_type все тот же.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

@ Maroun, как уже обсуждалось, вот несколько вариантов.

  1. Приемник кролика получает данные как byte[] всегда.Вы можете заставить его использовать json конвертер, указав конфигурацию (--rabbit.converterBeanName=jsonConverter).Но это по умолчанию использует кодировщик Base64 и результирующий текст будет закодирован в формате Base64.Затем в пользовательском приложении, где он получает данные от биржи, на которой публикуется приемник, необходимо предоставить пользовательский конвертер, который декодирует свойство с использованием декодера Base64.
  2. Другой вариант, который у вас есть, - это исправить раковину Rabbit в соответствии с вашими потребностями.Клонируйте стартовый репозиторий приложения Rabbit и затем предоставьте PassthroughConverter, который просто пропускает входящий byte[] вниз по течению.Вам также необходимо как-то изменить тип содержимого в заголовке сообщения (на application/json).Тогда обычный конвертер Jackson будет работать на стороне пользовательского приложения, поскольку byte[] в этом случае не кодируется в Base64.
1 голос
/ 10 апреля 2019

Тип содержимого по умолчанию, установленный в заголовке для Rabbit-source: content-type: application/x-java-serialized-object.

Вы можете переопределить это поведение, передав:

1) --spring.cloud.stream.bindings.output.contentType='application/json' как встроенное свойство для Rabbit-source.

2) При развертывании потока вы можете переопределить свойство конкретного приложения через --properties="app.rabbit.spring.cloud.stream.bindings.output.contentType='application/json'.

После развертывания вы можете проверить, переопределено ли свойство, перейдя к конечной точке http://<APP-HOST>:<APP-PORT?/actuator/configprops для конкретного приложения.

Чтобы устранить все эти проблемы, вы можете запустить автономные приложения (т. Е. java -jar..), чтобы подтвердить поведение перед запуском их через SCDF. Если он работает автономно, он также должен работать в SCDF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...