トピックの解決策

宛先トピックは、メッセージを生成または消費するときに必要です。フレームワークは、次の順序付けされた場所を検索してトピックを決定します (最初の検索で停止します)。

  • ユーザー指定

  • メッセージ型のデフォルト

  • グローバルデフォルト

デフォルトのメカニズムのいずれかを介してトピックが見つかった場合、生成 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) {
}

2.2. カスタムトピックリゾルバー

マッピングを追加する推奨される方法は、上記のプロパティを使用することです。ただし、さらに制御が必要な場合は、独自の実装を証明することでデフォルトのリゾルバーを置き換えることができます。例:

@Bean
public MyTopicResolver topicResolver() {
	return new MyTopicResolver();
}

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 プロパティのいずれかによって構成されます。