使用KafkaStreams处理

时间:2020-05-22 20:04:17

标签: apache-kafka apache-kafka-streams

我一直在使用covid19api持有的数据来实现Kafka生产者/消费者和流。

我试图从例如端点https://api.covid19api.com/all中提取每天的每日病例。但是,此服务以及该API的其余服务均具有自疾病发作以来的所有数据(确诊,死亡和康复病例),但具有累积性,而不是日常病例,这就是最终的结果。我试图实现。

由于场景不同,因此使用transformValues和StoreBuilder(建议使用here)对我也不起作用。我使用transformValue功能实现了一些不同的东西,但是每次检索到的上一个值都是该主题的标题,而不是实际的上一个

@Override
public String transform(Long key, String value) {
    String prevValue = state.get(key);
    log.info("{} => {}", key, value) ;
    if (prevValue != null) {
        Covid19StatDto prevDto = new Gson().fromJson(prevValue, Covid19StatDto.class);
        Covid19StatDto dto = new Gson().fromJson(value, Covid19StatDto.class);

        log.info("Current value {} previous {} ", dto.toString(), prevDto.toString());

        dto.setConfirmed(dto.getConfirmed() - prevDto.getConfirmed());

        String newDto = new Gson().toJson(dto);
        log.info("New value {}", newDto);
        return newDto;
    } else {
        state.put(key, value);
    }
    return value;
}

¿当我使用流对其进行处理时,如何从主题中获取上一条消息?任何帮助或建议将不胜感激。

致谢。

1 个答案:

答案 0 :(得分:1)

问题不仅在于您是否只在状态存储区中存储了每个键的第一个值?如果在每条后续消息上总是需要上一条消息,那么您需要始终将当前消息作为最后一步存储在状态存储中,例如:

@Override
public String transform(Long key, String value) {
    String prevValue = state.get(key);
    log.info("{} => {}", key, value) ;
    if (prevValue != null) {
        Covid19StatDto prevDto = new Gson().fromJson(prevValue, Covid19StatDto.class);
        Covid19StatDto dto = new Gson().fromJson(value, Covid19StatDto.class);

        log.info("Current value {} previous {} ", dto.toString(), prevDto.toString());

        dto.setConfirmed(dto.getConfirmed() - prevDto.getConfirmed());

        String newDto = new Gson().toJson(dto);
        log.info("New value {}", newDto);
        return newDto;
    }

    // Always update the state store:
    state.put(key, value);
    return value;
}