我一直在使用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;
}
¿当我使用流对其进行处理时,如何从主题中获取上一条消息?任何帮助或建议将不胜感激。
致谢。
答案 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;
}