如何创建一个KTable,指定一个json序列化程序和一个具有实体化定义的商店名称

时间:2018-08-24 12:41:47

标签: apache-kafka apache-kafka-streams

我想创建一个具有关联状态存储的KTable,该状态存储可以通过交互式查询来查询,例如:

val builder = StreamsBuilder()
        builder.table(CUSTOMERS_TOPIC, Materialized.`as`<String, Customer, KeyValueStore<Bytes, ByteArray>>(CUSTOMERS_STORE))

但是,为了序列化我的Customer值类,我需要指定一个Json序列化器。我可以使用StreamsBuilder中的此方法来做到这一点:

public synchronized <K, V> KTable<K, V> table(final String topic,
                                                  final Consumed<K, V> consumed) {

已消耗的食物:

Consumed.with(Serdes.String(), Serdes.serdeFrom(JsonPojoSerializer<Customer>(), JsonPojoDeserializer(Customer::class.java)

但是如您所见,无法设置商店名称。而且,根据javadoc,内部状态存储可能不是可查询的:

  

具有内部商店名称。请注意,商店名称可能不是可查询的   通过交互式查询

那么我如何用指定的名称配置实现,并指出必要的Json序列化程序?

1 个答案:

答案 0 :(得分:1)

在Scala API中,SERDES是通过隐式解析的。这就是为什么没有重载要传递Consumed参数的原因。 cf. https://github.com/apache/kafka/blob/trunk/streams/streams-scala/src/main/scala/org/apache/kafka/streams/scala/StreamsBuilder.scala#L88-L129

对于Java,有一个方法重载,可让您传递两个参数:

public synchronized <K, V> KTable<K, V> table(final String topic,
                                              final Consumed<K, V> consumed,
                                              final Materialized<K, V, KeyValueStore<Bytes, byte[]>> materialized) {

Cf。 https://kafka.apache.org/20/javadoc/org/apache/kafka/streams/StreamsBuilder.html#table-java.lang.String-org.apache.kafka.streams.kstream.Consumed-org.apache.kafka.streams.kstream.Materialized-