我试图访问在同一Java程序中创建的inMemoryStore。但是返回一个异常 “线程“主”中的异常org.apache.kafka.streams.errors.InvalidStateStoreException:状态存储storeName可能已迁移到另一个实例。”
当我使用persistentKeyValueStore时,它可以正常工作,并且能够创建存储并返回值。
v1 <- c("r_1", "r_2", "r_10")
线程“主”中的异常 org.apache.kafka.streams.errors.InvalidStateStoreException:状态 存储,样本可能已迁移到另一个实例。在 org.apache.kafka.streams.state.internals.QueryableStoreProvider.getStore(QueryableStoreProvider.java:62) 在 org.apache.kafka.streams.KafkaStreams.store(KafkaStreams.java:1067) 在 com.bakdata.streams_store.demo.InMemoryStore.main(InMemoryStore.java:59)
我希望打印ReadOnlyStoreQuery中的值。
答案 0 :(得分:0)
流上不能有StateStore,因为单个键可能有多个值。您需要先将其转换为KTable(streams.table(...)
)或GlobalKtable(streams.globalTable(...)
)。
Kotlin示例:
val businessObjects = streamsBuilder.globalTable("topic", eventStore("store-name"))
其中eventStore
是:
fun eventStore(name: String) = Materialized.`as`<String, String>(Stores.inMemoryKeyValueStore(name))
.withKeySerde(Serdes.String())
.withValueSerde(Serdes.String())
启动流后:
var store: ReadOnlyKeyValueStore<String, String> = streams.store("store-name", keyValueStore<String, String>())
注意:当流准备就绪时,还有一个接口KafkaStreams.StateListener
override fun onChange(newState: KafkaStreams.State?, oldState: KafkaStreams.State?) =
Option.fromNullable(newState)
.filter { REBALANCING == oldState && RUNNING == it }
.map { store = streams.store("store-name", keyValueStore<String, String>()) }
.getOrElse { log.info("Waiting for Kafka being in REBALANCING -> RUNNING, but it is $oldState -> $newState") }
或者,您也可以使用
将流变成KTable
stream.groupByKey().reduce(...)
就像所描述的here。