Spring整合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

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值