代码之家  ›  专栏  ›  技术社区  ›  Thiru

使用avro时,kafka state store返回null

  •  0
  • Thiru  · 技术社区  · 7 年前

    我们有一个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 ,并意识到密钥上出现了一些内容(可能是魔法字节!)。请参考下面的图片

    enter image description here

    那么,问题是如何使用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;
    }
    
    0 回复  |  直到 7 年前