“Tombstone”记录的 Null 负载和日志压缩
当您使用 Log Compaction 时,您可以发送和接收带有负载的消息,以识别密钥的删除。null
您还可以出于其他原因接收值,例如,当 a 无法反序列化值时可能会返回该值。null
Deserializer
null
要使用 发送有效负载,可以将 null 传递到方法的 value 参数中。
一个例外是变体。
由于不能有有效负载,因此您可以使用名为 的特殊有效负载类型,框架会发送 .
为方便起见,提供了 static。null
KafkaTemplate
send()
send(Message<?> message)
spring-messaging
Message<?>
null
KafkaNull
null
KafkaNull.INSTANCE
当您使用消息侦听器容器时,收到的容器具有一个 .ConsumerRecord
null
value()
要配置 以处理有效负载,必须将注释与 .
如果它是压缩日志的逻辑删除消息,则通常还需要该键,以便您的应用程序可以确定哪个键是 “”。
以下示例显示了此类配置:@KafkaListener
null
@Payload
required = false
deleted
@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
@KafkaHandler
KafkaNull
@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) {
...
}
}
请注意,参数是 ,而不是 。null
KafkaNull
请参阅手动分配所有分区。 |
此功能需要使用 框架将在使用默认 .
使用自定义时,请参阅将自定义 HandlerMethodArgumentResolver 添加到@KafkaListener 。KafkaNullAwarePayloadArgumentResolver MessageHandlerMethodFactory MessageHandlerMethodFactory |