“逻辑删除”记录的空有效负载和日志压缩
使用日志压缩时,您可以使用null
有效负载来标识密钥的删除。
您还可以收到null
值,例如可能返回null
当它无法反序列化值时。
生成空有效负载
要发送null
有效负载,使用PulsarTemplate
,您可以使用 fluent API 并将 null 传递到newMessage()
方法,例如:
pulsarTemplate
.newMessage(null)
.withTopic("my-topic")
.withSchema(Schema.STRING)
.withMessageCustomizer((mb) -> mb.key("key:1234"))
.send();
发送空值时,必须指定模式类型,因为系统无法从null 有效载荷。 |
使用空有效负载
为@PulsarListener
和@PulsarReader
这null
有效负载根据其消息参数的类型传递到侦听器方法中,如下所示:
参数类型 | 传入价值 |
---|---|
原始 |
|
用户定义 |
|
|
非空 Pulsar 消息,其 |
|
非空 Spring 消息,其 |
|
非空列表,其条目 ( |
|
非空 Pulsar 消息的非空容器,其 |
当传入值为null (即具有原始或用户定义类型的单记录侦听器)您必须使用@Payload 参数注释required = false . |
使用弹簧时org.springframework.messaging.Message 对于侦听器有效负载类型,其通用类型信息必须足够宽才能接受Message<PulsarNull> (例如。Message ,Message<?> 或Message<Object> ).
这是因为 Spring Message 不允许其有效负载使用 null 值,而是使用PulsarNull 占 位 符。 |
如果它是压缩日志的逻辑删除消息,则通常还需要密钥,以便应用程序可以确定哪个密钥是”deleted
".
以下示例显示了这样的配置:
@PulsarListener(
topics = "my-topic",
subscriptionName = "my-topic-sub",
schemaType = SchemaType.STRING)
void myListener(
@Payload(required = false) String msg,
@Header(PulsarHeaders.KEY) String key) {
...
}
这@PulsarReader 尚不支持@Header 参数,因此它在日志压缩方案中不太有用。 |