我在使用@StreamListener
消费多个主题的一些尝试中遇到了spring-boot-stream的问题。
根据spring-cloud-stream文档: Accordidng to docs:
目标
绑定上的通道的目标目标 中间件(例如,RabbitMQ交换或Kafka主题)。如果 频道被绑定为消费者,可以绑定到多个 目标和目标名称可以指定为逗号 分隔的字符串值。如果未设置,则使用通道名称。 这个>的默认值财产不能被覆盖。
但是,在我使用下一个配置后:
spring:
cloud:
stream:
bindings:
testchannel:
group: test
destination: platform.metrics, platform.sleuth
现在我有下一个错误:
Caused by: java.lang.IllegalArgumentException: Topic name can only have ASCII alphanumerics, '.', '_' and '-'
at org.springframework.cloud.stream.binder.kafka.utils.KafkaTopicUtils.validateTopicName(KafkaTopicUtils.java:39) ~[spring-cloud-stream-binder-kafka-core-1.2.1.RELEASE.jar:1.2.1.RELEASE]
at org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner.provisionProducerDestination(KafkaTopicProvisioner.java:107) ~[spring-cloud-stream-binder-kafka-core-1.2.1.RELEASE.jar:1.2.1.RELEASE]
at org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner.provisionProducerDestination(KafkaTopicProvisioner.java:60) ~[spring-cloud-stream-binder-kafka-core-1.2.1.RELEASE.jar:1.2.1.RELEASE]
at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.doBindProducer(AbstractMessageChannelBinder.java:110) ~[spring-cloud-stream-1.2.2.RELEASE.jar:1.2.2.RELEASE]
... 20 common frames omitted
如何将多个主题绑定到一个@StreamListner
或从主题列表生成动态streamListeners?
答案 0 :(得分:1)
您只需要替换逗号和下一个目标值之间的空格,它将如下所示:
spring:
cloud:
stream:
bindings:
testchannel:
group: test
destination: platform.metrics,platform.sleuth
答案 1 :(得分:0)
在这里,我写了更多有关如何向动态目标发送消息以及如何从动态目标接收消息的详细信息。
https://stackoverflow.com/a/56446574/4587961
正如Varun Miglani所说,主题之间用逗号分隔,没有空格。
spring:
cloud:
stream:
default:
consumer:
concurrency: 2
partitioned: true
bindings:
# inputs
input:
group: application_name_group
destination: topic-1,topic-2
content-type: application/json;charset=UTF-8
要动态发送消息,请使用 BinderAwareChannelResolver 和 dynamicDestinations 属性。
spring:
cloud:
stream:
dynamicDestinations: output.topic.1,output.topic2,output.topic.3