如何使用Processor API访问DSL创建的KTable / GlobalKTable?

时间:2018-06-15 16:33:09

标签: apache-kafka-streams

我使用的是处理器API(PAPI)拓扑。

是否可以从Processor API中访问使用DSL创建的KTable(或GlobalKTable)(即使是只读的)?

即。使用:

val builder = new StreamsBuilder()
val KTable = builder.table("topicname")

我得到了一个KTable,但拓扑只允许你将addStateStore与StoreBuilder一起使用,而不是KTable本身。

.addStateStore(myStoreBuilder, MY_PROCESSOR_NAME)

所以我可以通过这样做来构建一个:

def keyValueStoreBuilder[K, V](storeName: String, keySerde: Serde[K], valueSerde: Serde[V]): StoreBuilder[KeyValueStore[K, V]] = {
Stores.keyValueStoreBuilder(
  Stores.persistentKeyValueStore(storeName),
  keySerde,
  valueSerde)

}

但是,在这种情况下如何干净地获得storeName

1 个答案:

答案 0 :(得分:2)

创建Topology#describe()时,它会自动在内部创建一个带有生成名称的商店。 (您可以通过table()获取名称)。您还可以使用Materialized参数通过Processor方法为商店指定名称。

我有点不清楚,你的意思是"访问处理器API中的KTable"虽然?如果您的意思是"在Topology#connectProcessorAndStateStores()"内访问KTable商店。您可以使用table()授予处理器对商店的访问权限。请注意,处理器永远不应写入KTable存储区,因为ANDROID_SDK_ROOT运算符负责维护表的状态。如果您确实写入了商店,则无法保证,如果发生故障,您可能会丢失数据。