トピックの解決策
宛先トピックは、メッセージを生成または消費するときに必要です。フレームワークは、次の順序付けされた場所を検索してトピックを決定します (最初の検索で停止します)。
ユーザー指定
メッセージ型のデフォルト
グローバルデフォルト
デフォルトのメカニズムのいずれかを介してトピックが見つかった場合、生成 API または消費 API でトピックを指定する必要はありません。
トピックが見つからない場合、API はそれに応じて例外をスローします。
1. ユーザー指定
使用されている API に渡されるトピックの優先順位が最も高くなります (例: PulsarTemplate.send("my-topic", myMessage)
または @PulsarListener(topics = "my-topic"
)。
2. メッセージ型のデフォルト
API にトピックが渡されない場合、システムは、生成または消費されるメッセージの型に対して構成されたメッセージ型とトピックのマッピングを検索します。
マッピングは spring.pulsar.defaults.type-mappings
プロパティを使用して構成できます。次の例では、application.yml
を使用して、Foo
または Bar
メッセージを消費または生成するときに使用するデフォルトのトピックを構成します。
spring:
pulsar:
defaults:
type-mappings:
- message-type: com.acme.Foo
topic-name: foo-topic
- message-type: com.acme.Bar
topic-name: bar-topic
message-type は、メッセージクラスの完全修飾名です。 |
メッセージ (または Publisher 入力の最初のメッセージ) が null の場合、フレームワークはそこからトピックを判断できません。アプリケーションが null メッセージを送信する可能性がある場合は、別の方法を使用してトピックを指定します。 |
2.1. アノテーションで指定
トピックが API に渡されず、カスタムトピックマッピングが構成されていない場合、システムは、生成または消費されるメッセージのクラスで @PulsarMessage
アノテーションを探します。デフォルトのトピックは、アノテーションの topic
属性を介して指定できます。
次の例では、型 Foo
のメッセージを生成または消費するときに使用するデフォルトのトピックを構成します。
@PulsarMessage(topic = "foo-topic")
record Foo(String value) {
}
プロパティプレースホルダーと SpEL 式は、@PulsarMessage
アノテーションでサポートされています。例:
@PulsarMessage(topic = "${app.topics.foo}")
record Foo(String value) {
}
@PulsarMessage(topic = "#{someBean.getTopic()}")
record Bar(String value) {
}
3. プロデューサーのグローバルデフォルト
(生成時に) 最後に参照される場所は、システム全体のプロデューサーのデフォルトトピックです。これは、命令型 API を使用する場合は spring.pulsar.producer.topic-name
プロパティを介して構成され、リアクティブ API を使用する場合は spring.pulsar.reactive.sender.topic-name
プロパティを介して構成されます。
4. コンシューマーのグローバルデフォルト
(使用時に) 最終的に参照される場所は、システム全体のコンシューマーのデフォルトトピックです。これは、命令型 API を使用する場合は spring.pulsar.consumer.topics
または spring.pulsar.consumer.topics-pattern
プロパティを介して構成され、リアクティブ API を使用する場合は spring.pulsar.reactive.consumer.topics
または spring.pulsar.reactive.consumer.topics-pattern
プロパティのいずれかによって構成されます。