Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 无法解码spring云流DefaultKafkaHeaderMapper中的json类型_Apache Kafka_Spring Kafka_Spring Cloud Stream_Spring Cloud Sleuth_Spring Cloud Stream Binder Kafka - Fatal编程技术网

Apache kafka 无法解码spring云流DefaultKafkaHeaderMapper中的json类型

Apache kafka 无法解码spring云流DefaultKafkaHeaderMapper中的json类型,apache-kafka,spring-kafka,spring-cloud-stream,spring-cloud-sleuth,spring-cloud-stream-binder-kafka,Apache Kafka,Spring Kafka,Spring Cloud Stream,Spring Cloud Sleuth,Spring Cloud Stream Binder Kafka,我们正在使用spring cloud stream并计划升级我们的卡夫卡版本。 我们的应用程序使用ApacheKafka服务器的SpringCloudStream:2.0.0(SpringKafka 2.1.7)和ApacheKafka服务器1.0.1 还可以使用springcloudsleuth:2.0.0进行跟踪。 我们将把Kafka服务器升级到版本2.3.0,因此需要升级到spring boot 2.2.x(Hoxton),使用spring cloud sleuth:2.2.0和sprin

我们正在使用spring cloud stream并计划升级我们的卡夫卡版本。
我们的应用程序使用ApacheKafka服务器的SpringCloudStream:2.0.0(SpringKafka 2.1.7)和ApacheKafka服务器
1.0.1
还可以使用
springcloudsleuth:2.0.0
进行跟踪。
我们将把Kafka服务器升级到版本
2.3.0
,因此需要升级到
spring boot 2.2.x(Hoxton)
,使用
spring cloud sleuth:2.2.0
spring cloud stream:3.0.3(Horsham.SR3)

我们有约200个使用卡夫卡的应用程序,因此升级将逐步进行,因此作为中间状态,我们将有更新版本的生产者和使用旧版本的消费者。
我们的消费者正在使用
@StreamListener

在我们的测试过程中,我们遇到了一个问题,即解析大多数类型为
String
的头并获得以下信息:

ERROR 27448 --- [container-0-C-1] o.s.c.s.b.k.KafkaMessageChannelBinder$4  : Could not decode json type: ecb89ccb3e79418b for key: X-B3-TraceId
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'ecb89ccb3e79418b': was expecting ('true', 'false' or 'null')
 at [Source: (byte[])"ecb89ccb3e79418b"; line: 1, column: 33]
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1804) ~[jackson-core-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:679) ~[jackson-core-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3526) ~[jackson-core-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2621) ~[jackson-core-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:826) ~[jackson-core-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:723) ~[jackson-core-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4141) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4000) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3091) ~[jackson-databind-2.9.6.jar:2.9.6]
    at org.springframework.kafka.support.DefaultKafkaHeaderMapper.lambda$toHeaders$1(DefaultKafkaHeaderMapper.java:233) ~[spring-kafka-2.1.7.RELEASE.jar:2.1.7.RELEASE]
    at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_221]
    at org.springframework.kafka.support.DefaultKafkaHeaderMapper.toHeaders(DefaultKafkaHeaderMapper.java:216) ~[spring-kafka-2.1.7.RELEASE.jar:2.1.7.RELEASE]
    at org.springframework.cloud.stream.binder.kafka.KafkaMessageChannelBinder$4.toHeaders(KafkaMessageChannelBinder.java:554) ~[spring-cloud-stream-binder-kafka-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.kafka.support.converter.MessagingMessageConverter.toMessage(MessagingMessageConverter.java:106) ~[spring-kafka-2.1.7.RELEASE.jar:2.1.7.RELEASE]
    at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.toMessagingMessage(MessagingMessageListenerAdapter.java:229) ~[spring-kafka-2.1.7.RELEASE.jar:2.1.7.RELEASE]
...
而类型标题为:

{spanTraceId=java.lang.String, spanId=java.lang.String, spanParentSpanId=java.lang.String, nativeHeaders=org.springframework.util.LinkedMultiValueMap, X-B3-SpanId=java.lang.String, X-B3-ParentSpanId=java.lang.String, scst_partition=java.lang.Integer, X-B3-Sampled=java.lang.String, X-B3-TraceId=java.lang.String, spanSampled=java.lang.String, contentType=java.lang.String}
例如,Sleuth添加的
X-B3-SpanId
类型为String,值为:ecb89ccb3e79418b,不是JSON字符串,因此ObjectMapper在转换为String对象时失败:

headers.put(h.key(), getObjectMapper().readValue(h.value(), type))
当我们有字符串类型时,它似乎不应该使用ObjectMapper,因此我们的旧使用者失败了


使用新生产者和旧消费者时,是否有办法防止此问题?

您可以将
DefaultKafkaHeaderMapper
配置为与旧版本兼容:

/**
*设置为true可将字符串值头编码为JSON(“…”),默认情况下仅为
*原始字符串值使用配置的字符集转换为字节数组。着手
*如果出站记录的使用者正在使用Spring for Apache Kafka版本,则为true
*小于2.3
*@param encodeStrings true表示编码(默认为false)。
*@自2.3
*/
公共void setEncodeStrings(布尔encodeStrings){
this.encodeStrings=encodeStrings;
}
也看到


spring.cloud.stream.kafka.binder.headerMapperBeanName

Hi@gary,这个建议不起作用。我们尝试使用Hoxton.SR3生成,并按照建议在
DefaultKafkaHeaderMapper
上设置
encodeStrings flag=true
。使用此设置,使用者可以处理所有字符串标题,但在内容类型标题上失败。此标头的类型值已更改为
org.springframework.util.MimeType
(由于标志更改),且值为“application/json”,因此它尝试将其转换为json,但在此处失败:
headers.put(h.key(),getObjectMapper().readValue(h.value(),type))代码。尝试将
BinderHeaderMapper
与属性集一起使用,而不是
DefaultKafkaHeaderMapper
;它最初是一个克隆,但我在那里看到了一些额外的代码来处理
MimeType
。感谢@gary-
BinderHeaderMapper
做到了这一点,从
spring kafka:2.3.7开始,没有其他与头相关的问题