从Kafka ktable正确删除记录

时间:2019-01-24 21:06:22

标签: java apache-kafka apache-kafka-streams spring-cloud-stream

我想从KTable中正确删除对象。

我有以下流处理数据:

input
.map(this::deserialize)
.filter(((key, event) ->
    Arrays.asList(
        "AssessmentInitialized",
        "AssessmentRenamed",
        "AssessmentDeleted"
    ).contains(event.eventType())))
.map( ... do mapping  ... )
.groupBy((key, event) -> key, Serialized.with(Serdes.String(), domainEventSerde))
.aggregate(
    Assessment::new,
    (key, event, assessment) -> assessment.handleEvent(event),
    Materialized.<String, Assessment, KeyValueStore<Bytes, byte[]>>as(ASSESSMENTS_STORE)
        .withKeySerde(Serdes.String())
        .withValueSerde(assessmentSerde)
);

assessment.handleEvent(event)在处理null事件时返回AssessmentDeleted。 Serde是this.assessmentSerde = new JsonSerde<>(Assessment.class, objectMapper);,其中mapper是默认的com.fasterxml.jackson.databind.ObjectMapper bean。

此流处理完事件后,我在Kafka KTable更新日志中看到以下值:

{
"topic": "events-consumer-v1-assessments-store-changelog",
"key": "5d6d7a70-c907-460f-ac88-69705f079939",
"value": "ée",
"partition": 0,
"offset": 2
}

看起来不像我想要的东西。这样删除对象的方法正确吗?我期望如果将null作为值推入聚合操作,它将被删除,但看起来好像有些残废,而且我不确定其映射器问题还是删除方式不正确或KTable行为正确。

1 个答案:

答案 0 :(得分:0)

在您看来,检查工具中存在问题。由于某些原因,它无法正确反序列化null值。 总是最好先使用Kafka工具(kafka-console-consumer.shkafka-console-producer.sh)进行检查。