【Spring连载】使用Spring访问 Apache Kafka(十六)----空payload和‘Tombstone‘记录的日志压缩

【Spring连载】使用Spring访问 Apache Kafka(十六)----空payload和'Tombstone'记录的Log Compaction


当你使用Log Compaction时,你可以发送和接收具有空payload的消息,以识别key的删除。
你也可以出于其他原因接收到null值,例如反序列化程序在无法反序列化值时可能返回null。
要使用KafkaTemplate发送null负载,可以将null传递到send()方法的value参数中,但一个例外是send(Message message)变体。由于spring-messaging Message不能有null payload,你可以使用一种称为KafkaNull的特殊payload类型,并且框架会发送null。为了方便起见,框架提供了静态的“KafkaNull.INSTANCE”。
当你使用消息监听器容器时,接收到的ConsumerRecord具有null value()。
要将@KafkaListener配置为可以处理null payload,必须使用required=false的@Payload注解。如果它是compacted日志的tombstone消息,通常还需要key,以便应用程序可以确定“删除”了哪个key。以下示例展示了这样的配置:

@KafkaListener(id = "deletableListener", topics = "myTopic")
public void listen(@Payload(required = false) String value, @Header(KafkaHeaders.RECEIVED_KEY) String key) {
    // value == null represents key deletion
}

当你使用类级别的@KafkaListener时,有多个@KafkaHandler方法,需要一些额外的配置。具体来说,你需要一个带有KafkaNull payload的@KafkaHandler方法。以下示例展示如何配置:

@KafkaListener(id = "multi", topics = "myTopic")
static class MultiListenerBean {

    @KafkaHandler
    public void listen(String cat) {
        ...
    }

    @KafkaHandler
    public void listen(Integer hat) {
        ...
    }

    @KafkaHandler
    public void delete(@Payload(required = false) KafkaNull nul, @Header(KafkaHeaders.RECEIVED_KEY) int key) {
        ...
    }

}

这个特性需要使用KafkaNullAwarePayloadArgumentResolver,框架将在使用默认的MessageHandlerMethodFactory时配置它。当使用自定义MessageHandlerMethodFactory时,请参见为@KafkaListener添加自定义HandlerMethodArgumentResolver。

你可能感兴趣的:(spring,apache,kafka)