我有一个简单的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
? reference guide似乎没有答案。
发行版本:
更新:
如@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
还是一样。
答案 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,正如所讨论的,这里是一些选项。
byte[]
一样接收数据。您可以通过提供配置({{1})来强制它使用json转换器。但这默认情况下使用Base64编码器,并且结果文本将采用Base64编码。然后,在自定义应用程序中,它从接收器发布到的交易所接收数据,您需要提供一个自定义转换器,该转换器使用Base64解码器进行属性解码。 --rabbit.converterBeanName=jsonConverter
,它仅将传入的PassthroughConverter
传递到下游。您还需要以某种方式更改Message标头上的内容类型(更改为byte[]
)。然后,普通的application/json
转换器将在自定义应用程序端运行,因为在这种情况下Jackson
不是经过Base64编码的。