我的应用程序有问题。
代码:
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)
答案 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()
方法。您可以在此处阅读更多详细信息。
另一种选择是将.withKeySerde()
和.withValueSerde()
方法与自定义商店名称一起使用,如下所示。
Materialized.<Long,byte[],KeyValueStore<Long,byte[]>>as("networkStore").withKeySerde(longSerde).withValueSerde(byteSerde)