SpringCloud 出站序列化
如果禁用本机编码(这是默认设置),则框架将使用用户设置的contentType转换消息(否则,将应用默认的application/json
)。在这种情况下,对于出站序列化,它将忽略出站上设置的任何SerDe。
这是在出站上设置contentType的属性。
spring.cloud.stream.bindings.output.contentType: application/json
这是启用本机编码的属性。
spring.cloud.stream.bindings.output.nativeEncoding: true
如果在输出绑定上启用了本机编码(用户必须如上所述明确地启用本机编码),则框架将在出站上跳过任何形式的自动消息转换。在这种情况下,它将切换到用户设置的Serde。将使用在实际输出绑定上设置的valueSerde
属性。这是一个例子。
spring.cloud.stream.kafka.streams.bindings.output.producer.valueSerde: org.apache.kafka.common.serialization.Serdes$StringSerde
如果未设置此属性,则它将使用“默认” SerDe:spring.cloud.stream.kafka.streams.binder.configuration.default.value.serde
。
值得一提的是,Kafka Streams绑定程序不会在出站上序列化密钥-它仅依赖于Kafka本身。因此,您必须在绑定上指定keySerde
属性,否则它将默认为应用程序范围的公用keySerde
。
绑定级别密钥serde:
spring.cloud.stream.kafka.streams.bindings.output.producer.keySerde
公用密钥序列:
spring.cloud.stream.kafka.streams.binder.configuration.default.key.serde
如果使用分支,则需要使用多个输出绑定。例如,
interface KStreamProcessorWithBranches { @Input("input") KStream<?, ?> input(); @Output("output1") KStream<?, ?> output1(); @Output("output2") KStream<?, ?> output2(); @Output("output3") KStream<?, ?> output3(); }
如果设置了nativeEncoding
,则可以如下对各个输出绑定设置不同的SerDe。
spring.cloud.stream.kafka.streams.bindings.output1.producer.valueSerde=IntegerSerde spring.cloud.stream.kafka.streams.bindings.output2.producer.valueSerde=StringSerde spring.cloud.stream.kafka.streams.bindings.output3.producer.valueSerde=JsonSerde
然后,如果您具有SendTo
这样的@SendTo({“ output1”,“ output2”,“ output3”}),则分支中的KStream[]
将应用上面定义的正确的SerDe对象。如果未启用nativeEncoding
,则可以如下在输出绑定上设置不同的contentType值。在这种情况下,框架将使用适当的消息转换器在将消息发送到Kafka之前转换消息。
spring.cloud.stream.bindings.output1.contentType: application/json spring.cloud.stream.bindings.output2.contentType: application/java-serialzied-object spring.cloud.stream.bindings.output3.contentType: application/octet-stream
更多建议: