Java 卡夫卡流-使用Protobuf serde获取问题
我正在创建一个Kafka Streams应用程序,我的主题数据来自Protobuf。我们可以为此创建Java代码绑定。然而,我正在努力使用正确的serde来使用来自主题的数据。有人能告诉我我做错了什么吗 以下是我使用的属性定义:Java 卡夫卡流-使用Protobuf serde获取问题,java,apache-kafka,apache-kafka-streams,confluent-schema-registry,Java,Apache Kafka,Apache Kafka Streams,Confluent Schema Registry,我正在创建一个Kafka Streams应用程序,我的主题数据来自Protobuf。我们可以为此创建Java代码绑定。然而,我正在努力使用正确的serde来使用来自主题的数据。有人能告诉我我做错了什么吗 以下是我使用的属性定义: Properties properties = new Properties(); properties.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-app-id-config"); pr
Properties properties = new Properties();
properties.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-app-id-config");
properties.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "my-broker:my-port");
properties.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
properties.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, KafkaProtobufSerde.class);
properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
我的Serde课
public class AppSerdes extends Serdes {
public static KafkaProtobufSerde<ProtobufClass1> createConfiguredSerde1() {
KafkaProtobufSerde<ProtobufClass1> serde = new KafkaProtobufSerde<ProtobufClass1>();
Map<String, Object> serdeConfig = getSerdeConfig();
serde.configure(serdeConfig, false);
return serde;
}
public static KafkaProtobufSerde<ProtobufClass2> createConfiguredSerde2() {
KafkaProtobufSerde<ProtobufClass2> serde = new KafkaProtobufSerde<ProtobufClass2>();
Map<String, Object> serdeConfig = getSerdeConfig();
serde.configure(serdeConfig, false);
return serde;
}
private static Map<String, Object> getSerdeConfig() {
Map<String, Object> serdeConfig = new HashMap<>();
serdeConfig.put(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://localhost:8081");
return serdeConfig;
}
}
公共类AppSerdes扩展了Serdes{
公共静态KafkaProtobufSerde createConfiguredSerde1(){
KafkaProtobufSerde serde=新的KafkaProtobufSerde();
Map serdeConfig=getSerdeConfig();
serde.configure(serdeConfig,false);
返回serde;
}
公共静态KafkaProtobufSerde createConfiguredSerde2(){
KafkaProtobufSerde serde=新的KafkaProtobufSerde();
Map serdeConfig=getSerdeConfig();
serde.configure(serdeConfig,false);
返回serde;
}
私有静态映射getSerdeConfig(){
Map serdeConfig=新HashMap();
SERDECOFIG.put(AbstractKafkschemasERDECOFIG.SCHEMA\u REGISTRY\u URL\u CONFIG,“http://localhost:8081");
返回图;
}
}
这就是我创建KStream和KTable实例的方式:
StreamsBuilder streamBuilder = new StreamsBuilder();
KTable<String, ProtobufClass1> table = streamBuilder.table("topic1",
Consumed.with(AppSerdes.String(), AppSerdes.createConfiguredSerde1()));
KStream<String, ProtobufClass2> stream = streamBuilder.stream("topic2".
Consumed.with(AppSerdes.String(), AppSerdes.createConfiguredSerde2()));
StreamsBuilder streamBuilder=newstreamsbuilder();
KTable table=streamBuilder.table(“topic1”,
使用(AppSerdes.String(),AppSerdes.createConfiguredSerde1());
KStream stream=streamBuilder.stream(“topic2”。
使用(AppSerdes.String(),AppSerdes.createConfiguredSerde2());
然而,我得到以下错误:
org.apache.kafka.streams.errors.StreamsException:调用处理器的ClassCastException。处理器的输入类型是否与反序列化类型匹配?检查Serde设置并更改StreamConfig中的默认Serde,或通过方法参数提供正确的Serde。确保处理器可以接受key:java.lang.String和value:com.google.protobuf.DynamicMessage类型的反序列化输入。
请注意,尽管错误的SERDE是导致错误的常见原因,但强制转换异常可能还有其他原因(例如,在用户代码中)。例如,如果处理器在存储中连接,但不正确地强制转换泛型,则在处理过程中可能会引发类强制转换异常,但原因不会是错误的Serdes。
位于org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:185)
位于org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forwardInternal(ProcessorContextImpl.java:273)
位于org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:252)
位于org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:219)
位于org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:86)
位于org.apache.kafka.streams.processor.internals.StreamTask.lambda$process$1(StreamTask.java:703)
位于org.apache.kafka.streams.processor.internals.metrics.streamsmetricsiml.maybeemeasurerelationance(streamsmetricsiml.java:883)
位于org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:703)
位于org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:1105)
位于org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:647)
位于org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:553)
位于org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:512)
原因:java.lang.ClassCastException:com.google.protobuf.DynamicMessage无法强制转换为iit.datahub.party.system_crm.v1.CustomerAddressBase$CustomerAddressBaseEntity
位于org.apache.kafka.streams.kstream.internal.KStreamImpl.lambda$internalSelectKey$0(KStreamImpl.java:234)
位于org.apache.kafka.streams.kstream.internals.KStreamMap$kstreamapprocessor.process(KStreamMap.java:41)
位于org.apache.kafka.streams.processor.internals.ProcessorAdapter.process(ProcessorAdapter.java:71)
位于org.apache.kafka.streams.processor.internals.ProcessorNode.lambda$process$2(ProcessorNode.java:181)
位于org.apache.kafka.streams.processor.internals.metrics.streamsmetricsiml.maybeemeasurerelationance(streamsmetricsiml.java:883)
位于org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:181)
... 11更多我可以通过将此更改为
Map<String, Object> serdeConfig = getSerdeConfig();
Map serdeConfig=getSerdeConfig();
到
Map serdeConfig=getSerdeConfig();
此映射的键和值都是字符串。我可以通过将其从
Map<String, Object> serdeConfig = getSerdeConfig();
Map serdeConfig=getSerdeConfig();
到
Map serdeConfig=getSerdeConfig();
此映射的键和值都是字符串。我从未使用过protobuf。但是它说,
com.google.protobuf.DynamicMessage不能被转换到iit.datahub.party.system\u crm.v1.CustomerAddressBase$CustomerAddressBaseEntity
我想我应该试着找出com.google.protobuf.DynamicMessage
是什么类型的类。我有一个相同的错误DynamicMessage不能被转换到我从未使用过的
protobuf。但是它说,com.google.protobuf.DynamicMessage不能被转换到iit.datahub.party.system\u crm.v1.CustomerAddressBase$CustomerAddressBaseEntity
我想我应该试着找出com.google.protobuf.DynamicMessage
是什么类型的类。我有同样的错误DynamicMessage不能被转换到