我想创建一个具有关联状态存储的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序列化程序?
答案 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) {