卡夫卡为何更改商店名称

时间:2018-11-28 13:36:38

标签: java apache-kafka apache-kafka-streams

我的应用程序有问题。

代码:

KTable<Long, byte[]> table = stream.groupByKey().aggregate(() -> null , (key, oldVal, newVal) -> {
        return newVal;
    }, Materialized.<Long,byte[],KeyValueStore<Long,byte[]>>as("networkStore").with(longSerde, byteSerde));

在这里,我将商店名称设置为networkStore,但是当我列出Kafka主题时,商店的名称是network-service-KSTREAM-AGGREGATE-STATE-STORE-0000000001-changelog

我想要的是:-商店的名称为networkStore,以便以后可以阅读。

当我现在尝试从商店中读取信息时,它给了我以下异常:

  

org.apache.kafka.streams.errors.InvalidStateStoreException:状态存储networkStore可能已迁移到另一个实例。       在org.apache.kafka.streams.state.internals.QueryableStoreProvider.getStore(QueryableStoreProvider.java:60)       在org.apache.kafka.streams.KafkaStreams.store(KafkaStreams.java:1039)       在com.maxflow.networksservice.utils.NetworksServiceUtils.updateGraphForCompany(NetworksServiceUtils.java:41)       在com.maxflow.networksservice.consumer.NodesConsumer.run(NodesConsumer.java:99)       在java.lang.Thread.run(Thread.java:748)

1 个答案:

答案 0 :(得分:2)

使用以下内容:

KTable<Long, byte[]> table = stream.groupByKey().aggregate(() -> null , (key, oldVal, newVal) -> {
        return newVal;
    }, Materialized.with(longSerde, byteSerde).as("networkStore"));

Materialized.as().with()用内部名称覆盖自定义名称。因此,你 应该在.as()之后调用.with()方法。您可以在此处阅读更多详细信息。

https://kafka.apache.org/20/javadoc/org/apache/kafka/streams/kstream/Materialized.html#with-org.apache.kafka.common.serialization.Serde-org.apache.kafka.common.serialization.Serde-

另一种选择是将.withKeySerde().withValueSerde()方法与自定义商店名称一起使用,如下所示。

Materialized.<Long,byte[],KeyValueStore<Long,byte[]>>as("networkStore").withKeySerde(longSerde).withValueSerde(byteSerde)