线程“主要” org.apache.kafka.streams.errors.InvalidStateStoreException中的异常:

时间:2019-07-12 13:23:20

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

我试图访问在同一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中的值。

1 个答案:

答案 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