我们有一个ktable,在这里我们映射值并使用以下代码具体化到keyvaluestore:
@Bean
public KTable<String, CancelEvent> kTable(StreamsBuilder kStreamBuilder,
ValueMapper<CancelEvent, CancelEvent> mapper,
SpecificAvroSerde<CancelEvent> serde) {
return kStreamBuilder
.table(properties.getProperty("topics.cancel"), Consumed.with(Serdes.String(), serde))
.mapValues(mapper, Materialized.as("cancel-event-store"));
}
以及映射程序代码:
@Override
public CancelEvent apply(CancelEvent value) {
if (value.getData().getCancelled()) {
return null;
}
return value;
}
我们使用avro进行序列化和反序列化。当我们试图查询
state store
有了钥匙,它总会回来
null
.
查询状态存储的代码:
ReadOnlyKeyValueStore<String, CancelEvent> store = streamsFactory.getKafkaStreams()
.store("cancel-event-store", QueryableStoreTypes.keyValueStore());
CancelEvent event = store.get(queryEvent.getMeta().getId().toString());
event
总是
无效的
。在调试时,我迭代了
keyValuestore
,并意识到密钥上出现了一些内容(可能是魔法字节!)。请参考下面的图片
那么,问题是如何使用key进行查询?
更新1
private Map<String, Object> kStreamsConfigsProperties() {
final Map<String, Object> config = new HashMap<>();
config.put(APPLICATION_ID_CONFIG, "app.name" + new Date().getTime());
config.put(BOOTSTRAP_SERVERS_CONFIG, properties.getProperty("spring.kafka.bootstrap-servers"));
config.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, properties.getProperty("spring.kafka.schema-registry"));
config.put(DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
config.put(DEFAULT_VALUE_SERDE_CLASS_CONFIG, SpecificAvroSerde.class.getName());
config.put(DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, WallclockTimestampExtractor.class.getName());
return config;
}