NULL ペイロードと "Tombstone" レコードのログ圧縮
ログ圧縮を使用すると、null
ペイロードを含むメッセージを送受信して、キーの削除を識別できます。また、値をデシリアライズできないときに null
を返すデシリアライザーなど、他の理由で null
値を受け取ることもあります。
Null ペイロードの生成
PulsarTemplate
を使用して null
ペイロードを送信するには、fluent API を使用し、newMessage()
メソッドの value 引数に null を渡すことができます。例:
pulsarTemplate
.newMessage(null)
.withTopic("my-topic")
.withSchema(Schema.STRING)
.withMessageCustomizer((mb) -> mb.key("key:1234"))
.send();
NULL 値を送信する場合、システムは null ペイロードからメッセージの型を判断できないため、スキーマ型を指定する必要があります。 |
Null ペイロードの消費
@PulsarListener
および @PulsarReader
の場合、null
ペイロードは、次のようにメッセージパラメーターの型に基づいてリスナーメソッドに渡されます。
パラメーター型 | 渡された値 |
---|---|
primitive |
|
user-defined |
|
|
|
|
|
| エントリ ( |
|
|
渡された値が null (つまり、プリミティブ型またはユーザー定義型の単一レコードリスナー) の場合は、required = false とともに @Payload パラメーターアノテーションを使用する必要があります。 |
リスナーペイロード型に Spring org.springframework.messaging.Message を使用する場合、そのジェネリクス型情報は Message<PulsarNull> (例: Message 、Message<?> 、または Message<Object> ) を受け入れるのに十分な幅を持つ必要があります。これは、Spring メッセージがペイロードに null 値を許可せず、代わりに PulsarNull プレースホルダーを使用するという事実によるものです。 |
圧縮されたログの tombstone メッセージの場合、アプリケーションがどのキーが "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 引数をサポートしていないため、ログ圧縮シナリオではあまり役に立ちません。 |