使用日志压缩时,您可以发送和接收带有有效负载的消息,以识别密钥的删除。
您还可以出于其他原因接收值,例如,当无法反序列化值时可能会返回的反序列化程序。null
null
null
生成空有效负载
要使用 发送有效负载,可以使用 Fluent API 并将 null 传递到该方法的 value 参数中,例如:null
PulsarTemplate
newMessage()
pulsarTemplate
.newMessage(null)
.withTopic("my-topic")
.withSchema(Schema.STRING)
.withMessageCustomizer((mb) -> mb.key("key:1234"))
.send();
发送 null 值时,必须指定架构类型,因为系统无法确定有效负载中的消息类型。null |
发送 null 值时,必须指定架构类型,因为系统无法确定有效负载中的消息类型。null |
使用 Null 有效负载
对于 和 ,有效负载根据其消息参数的类型传递到 listener 方法中,如下所示:@PulsarListener
@PulsarReader
null
参数类型 | 传入值 |
---|---|
原始 |
|
用户定义 |
|
|
非空 Pulsar 消息,其返回 |
|
非空 Spring 消息,其返回 |
|
非空列表,其条目 () 是上述类型之一并相应地执行操作(即基元条目等)。 |
|
非空 Pulsar 消息的非 null 容器,其返回 |
当传入值为 (即具有基元或用户定义类型的单记录侦听器)时,必须将参数 annotation 与 .null @Payload required = false |
将 Spring 用于侦听器有效负载类型时,其泛型类型信息必须足够宽以接受(例如 、 或 )。
这是因为 Spring Message 不允许其有效负载为 null 值,而是使用占位符。org.springframework.messaging.Message Message<PulsarNull> Message Message<?> Message<Object> 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 |
参数类型 | 传入值 |
---|---|
原始 |
|
用户定义 |
|
|
非空 Pulsar 消息,其返回 |
|
非空 Spring 消息,其返回 |
|
非空列表,其条目 () 是上述类型之一并相应地执行操作(即基元条目等)。 |
|
非空 Pulsar 消息的非 null 容器,其返回 |
当传入值为 (即具有基元或用户定义类型的单记录侦听器)时,必须将参数 annotation 与 .null @Payload required = false |
将 Spring 用于侦听器有效负载类型时,其泛型类型信息必须足够宽以接受(例如 、 或 )。
这是因为 Spring Message 不允许其有效负载为 null 值,而是使用占位符。org.springframework.messaging.Message Message<PulsarNull> Message Message<?> Message<Object> PulsarNull |
尚不支持参数,因此在日志压缩方案中用处不大。@PulsarReader @Header |