Spring云流应用程序在一次垃圾输入后退出

Spring云流应用程序在一次垃圾输入后退出,spring,spring-cloud,spring-cloud-stream,spring-kafka,Spring,Spring Cloud,Spring Cloud Stream,Spring Kafka,我对使用KStream组件的SpringCloudStream应用程序有一个问题。它侦听一个输入,并在处理完消息后将其定向到一个输出 它希望输入一个JSON字符串,并尝试在到达时将其转换为Spring元组。发送消息时会发生相反的情况 问题是,当系统管理员想要使用kafka控制台producer.sh测试主题时,例如。。。然后打印一个字符串 “哈哈” 在它中,整个Spring cloud stream应用程序将在这里消亡,但以下情况除外: java.lang.RuntimeException: c

我对使用KStream组件的SpringCloudStream应用程序有一个问题。它侦听一个输入,并在处理完消息后将其定向到一个输出

它希望输入一个JSON字符串,并尝试在到达时将其转换为Spring元组。发送消息时会发生相反的情况

问题是,当系统管理员想要使用
kafka控制台producer.sh
测试主题时,例如。。。然后打印一个字符串

“哈哈”

在它中,整个Spring cloud stream应用程序将在这里消亡,但以下情况除外:

java.lang.RuntimeException: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'lol': was expecting ('true', 'false' or 'null')
 at [Source: lol; line: 1, column: 7]
    at org.springframework.tuple.JsonStringToTupleConverter.convert(JsonStringToTupleConverter.java:71) ~[spring-tuple-1.0.0.RELEASE.jar:na]
    at org.springframework.tuple.JsonStringToTupleConverter.convert(JsonStringToTupleConverter.java:31) ~[spring-tuple-1.0.0.RELEASE.jar:na]
    at org.springframework.tuple.TupleBuilder.fromString(TupleBuilder.java:153) ~[spring-tuple-1.0.0.RELEASE.jar:na]
    at org.springframework.cloud.stream.converter.TupleJsonMessageConverter.convertFromInternal(TupleJsonMessageConverter.java:90) ~[spring-cloud-stream-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.springframework.messaging.converter.AbstractMessageConverter.fromMessage(AbstractMessageConverter.java:175) ~[spring-messaging-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.messaging.converter.AbstractMessageConverter.fromMessage(AbstractMessageConverter.java:167) ~[spring-messaging-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.messaging.converter.CompositeMessageConverter.fromMessage(CompositeMessageConverter.java:55) ~[spring-messaging-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.cloud.stream.binder.kstream.KStreamListenerParameterAdapter$1.apply(KStreamListenerParameterAdapter.java:66) ~[spring-cloud-stream-binder-kstream-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.apache.kafka.streams.kstream.internals.KStreamMap$KStreamMapProcessor.process(KStreamMap.java:42) ~[kafka-streams-0.10.1.1.jar:na]
    at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:82) ~[kafka-streams-0.10.1.1.jar:na]
    at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:202) ~[kafka-streams-0.10.1.1.jar:na]
    at org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:66) ~[kafka-streams-0.10.1.1.jar:na]
    at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:180) ~[kafka-streams-0.10.1.1.jar:na]
    at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:436) ~[kafka-streams-0.10.1.1.jar:na]
    at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:242) ~[kafka-streams-0.10.1.1.jar:na]
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'lol': was expecting ('true', 'false' or 'null')
 at [Source: lol; line: 1, column: 7]
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702) ~[jackson-core-2.8.10.jar:2.8.10]
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558) ~[jackson-core-2.8.10.jar:2.8.10]
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2839) ~[jackson-core-2.8.10.jar:2.8.10]
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1903) ~[jackson-core-2.8.10.jar:2.8.10]
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:749) ~[jackson-core-2.8.10.jar:2.8.10]
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3850) ~[jackson-databind-2.8.10.jar:2.8.10]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3799) ~[jackson-databind-2.8.10.jar:2.8.10]
    at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2397) ~[jackson-databind-2.8.10.jar:2.8.10]
    at org.springframework.tuple.JsonStringToTupleConverter.convert(JsonStringToTupleConverter.java:44) ~[spring-tuple-1.0.0.RELEASE.jar:na]
我希望该框架至少对此类行为具有一定的容错能力。你不能期望输入总是好的、漂亮的。 所以我研究了Spring文档:

还有一些配置选项,用于在出现故障时隐藏重试逻辑的实现。例如,
maxtures
参数。但是这个参数已经使用了默认值3,但是我没有看到SpringCloudStream应用程序试图从这个错误中拯救出来

因此,我想知道为SpringCloudStream应用程序构建一些错误输入容忍度的推荐方法是什么

应用程序的配置如下所示:

spring:
    cloud:
        stream:
          bindings:
            input:
              content-type: application/json
              destination: inbound
              group: fraud
              consumer:
                headerMode: raw
            output:
              content-type: application/x-spring-tuple
              destination: outbound
              producer:
                headerMode: raw
                useNativeEncoding: true

spring.cloud.stream.kstream.binder.configuration:
  key.serde: org.apache.kafka.common.serialization.Serdes$StringSerde
  value.serde: org.apache.kafka.common.serialization.Serdes$StringSerde

在SpringCloudStream1.3.x(Ditmars)中,对Kafka流的错误处理的支持非常有限。事实上,由应用程序来处理1.3 kafka streams库中的任何错误。然而,在2.0.0中,我们增加了对KIP-161的支持

在kafka streams binder的2.0.0版本中使用此新功能,您可以记录并跳过记录,或者记录并在反序列化错误时失败记录。除此之外,绑定器还提供了DLQ发送异常处理程序实现。文档仍在2.0版本中更新。一旦准备就绪,我将更新这里的文档链接。但是,这里是它的要点

spring.cloud.stream.kafka.streams.binder.serdeError:sendToDlq
(或logAndFail或logAndSkip)

spring.cloud.stream.kafka.stream.bindings.input.consumer.dlqName:[dlq name]
-如果不提供此选项,则会出现
错误。[传入主题].[group name]

然后,您将在DLQ主题中看到反序列化错误的记录。
同样,这些功能仅在2.0.0.BUILD-SNAPSHOT中可用,并且将成为即将发布的
2.0.0.RC1
版本的一部分

谢谢你的回答!对于2.0.0版本的RC,您是否有任何粗略的日期可以添加?我必须决定实施我自己的处理或使用最新的代码。2.0.0.RC1应该在下周发布。