主题解决
生成或使用消息时需要目标主题。 框架在以下有序位置查找以确定主题(在第一个查找处停止):
-
用户指定
-
默认消息类型
-
全局默认值
通过默认机制之一找到主题时,无需在生产或消费 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. 生产者全局默认
咨询的最终位置(生产时)是系统范围的生产者默认主题。
它是通过spring.pulsar.producer.topic-name
使用命令式 API 时的属性和spring.pulsar.reactive.sender.topic-name
属性。
4. 消费者全局默认
查询的最终位置(使用时)是系统范围的使用者默认主题。
它是通过spring.pulsar.consumer.topics
或spring.pulsar.consumer.topics-pattern
属性,并且spring.pulsar.reactive.consumer.topics
或spring.pulsar.reactive.consumer.topics-pattern
属性。