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
Java 卡夫卡流-使用Protobuf serde获取问题_Java_Apache Kafka_Apache Kafka Streams_Confluent Schema Registry - Fatal编程技术网

Java 卡夫卡流-使用Protobuf 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

我正在创建一个Kafka Streams应用程序,我的主题数据来自Protobuf。我们可以为此创建Java代码绑定。然而,我正在努力使用正确的serde来使用来自主题的数据。有人能告诉我我做错了什么吗

以下是我使用的属性定义:

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不能被转换到