无法在RabbitMQ接收器中将content_type从application / octet-stream更改为application / json

时间:2019-04-10 12:31:49

标签: java rabbitmq spring-cloud-stream spring-cloud-dataflow

我有一个简单的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/jsonreference guide似乎没有答案。

发行版本:

  • 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 个答案:

答案 0 :(得分:1)

在Rabbit源的标头中设置的默认内容类型是:content-type: application/x-java-serialized-object

您可以通过传递以下行为来替代该行为:

1)console.log(4.1 - 1) console.log(4.02 - 1)作为Rabbit源的内联属性。

2)部署流时,可以通过--spring.cloud.stream.bindings.output.contentType='application/json'覆盖特定于应用程序的属性。

部署后,您可以通过转到特定于应用程序的--properties="app.rabbit.spring.cloud.stream.bindings.output.contentType='application/json'端点来确认是否覆盖了该属性。

要解决所有这些问题,您可以独立运行应用程序(即http://<APP-HOST>:<APP-PORT?/actuator/configprops)以确认行为,然后再通过SCDF运行它们。如果它可以独立运行,则也应在SCDF中运行。

答案 1 :(得分:1)

@Maroun,正如所讨论的,这里是一些选项。

  1. 兔子接收器始终像byte[]一样接收数据。您可以通过提供配置({{1})来强制它使用json转换器。但这默认情况下使用Base64编码器,并且结果文本将采用Base64编码。然后,在自定义应用程序中,它从接收器发布到的交易所接收数据,您需要提供一个自定义转换器,该转换器使用Base64解码器进行属性解码。
  2. 您还有另一个选择是打上兔子水槽以适应您的需求。克隆Rabbit app starter repo,然后提供一个--rabbit.converterBeanName=jsonConverter,它仅将传入的PassthroughConverter传递到下游。您还需要以某种方式更改Message标头上的内容类型(更改为byte[])。然后,普通的application/json转换器将在自定义应用程序端运行,因为在这种情况下Jackson不是经过Base64编码的。