主题解析
在生成或使用消息时,需要目标主题。 框架会查找以下有序位置以确定主题(在第一次查找时停止):
-
用户指定
-
消息类型默认
-
全局默认值
当通过默认机制之一找到主题时,无需在 produce 或 consume 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 类的完全限定名称。message-type |
如果消息(或输入的第一条消息)是 ,则框架将无法从中确定主题。如果您的应用程序可能发送消息,则应使用另一种方法来指定主题。Publisher null null |
2.1. 通过 annotation 指定
当没有主题传递到 API 中,并且没有配置自定义主题映射时,系统会在正在生成或使用的消息的类上查找注释。
可以通过 annotation 上的属性指定默认主题。@PulsarMessage
topic
以下示例配置了在生成或使用 message type 为 :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 时的 property 和使用 reactive API 时的 property 进行配置的。spring.pulsar.producer.topic-name
spring.pulsar.reactive.sender.topic-name
4. Consumer 全局默认值
查询的最后一个位置(使用时)是系统范围的使用者默认主题。
当使用命令式 API 时,它是通过 or 属性配置的,当使用反应式 API 时,它是通过 or 属性之一配置的。spring.pulsar.consumer.topics
spring.pulsar.consumer.topics-pattern
spring.pulsar.reactive.consumer.topics
spring.pulsar.reactive.consumer.topics-pattern