如何使用Spring Integration Translator处理在Kafka中收到的消息

时间:2018-08-27 00:49:01

标签: spring-integration spring-kafka

我将下面的数据发布到kafka中,并通过spring集成渠道接收并转换为 Log 对象,我如何使用spring集成转换器将下面的数据转换为Log对象?感谢您的帮助

  

'Log(clientKey = string,有效负载= string)'

这是频道适配器代码

@Bean
public KafkaMessageDrivenChannelAdapter<String, String> kafkaMessageDrivenChannelAdapter() {
    KafkaMessageDrivenChannelAdapter<String, String> kafkaMessageDrivenChannelAdapter = new KafkaMessageDrivenChannelAdapter<>(
            kafkaListenerContainer());
    kafkaMessageDrivenChannelAdapter.setPayloadType(Log.class);
    kafkaMessageDrivenChannelAdapter.setOutputChannel(inputChannel());
    return kafkaMessageDrivenChannelAdapter;
}

当我尝试使用以下内容在服务激活器中进行转换

 ObjectMapper objectMapper = new ObjectMapper();
 Log msg = objectMapper.readValue(arg0.getPayload().toString() , Log.class);

失败的原因

com.fasterxml.jackson.core.JsonParseException:无法识别的令牌“ Log”:正在等待(“ true”,“ false”或“ null”)

1 个答案:

答案 0 :(得分:2)

首先,'Log(clientKey=string, payload=string)'看起来不像格式正确的JSON,因为您希望在以后的Spring Integration中进行转换。

您的另一个担心kafkaMessageDrivenChannelAdapter.setPayloadType(Log.class);。这样,您不需要任何下游转换,MessagingMessageConverter中的IntegrationRecordMessageListener将为我们完成转换工作。

但是,我们仍然需要有适当的数据才能进行转换。

您还需要记住,Apache Kafka具有自己的机制,可以从网络中反序列化byte[]。有关转换和(反)序列化的更多信息,请参见Spring for Apache Kafka:https://docs.spring.io/spring-kafka/docs/current/reference/html/_reference.html#serdes

为了进行正确的JSON转换,Spring Integration提供了一个JsonToObjectTransformer组件,可以与@Transformer批注一起使用:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-transformation-chapter.html#_common_transformers

更新

@Transformer(inputChannel = "inputChannel", outputChannel = "processChannel")
@Bean
public JsonToObjectTransformer jsonToObjectTransformer() {
   return new JsonToObjectTransformer(Log.class);
}