主题解析
一个目的地主题在生产和消费消息时是必需的。 框架会按以下有序位置查找主题(在找到第一个时停止):
-
用户指定的内容
-
消息类型 默认
-
全局默认值
当通过其中一种默认机制找到主题时,在生产或消费API中无需指定主题。
当找不到主题时,API 将相应地抛出异常。
1. 指定用户
传入API的主题具有最高优先级(例如:PulsarTemplate.send("my-topic", myMessage) 或 @PulsarListener(topics = "my-topic")。
2. 默认消息类型
当未传递任何主题时,系统会查找为正在生产或消费的消息类型配置的消息类型到主题的映射。
映射可以使用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. 通过注解指定
当没有传递任何主题,并且没有配置自定义主题映射时,系统会在生产或消费的消息类上查找一个 @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属性进行配置。