单Spring Cloud Stream Function如何消费多RabbitMQ队列并生产到多交换机
问题根因
你当前定义的Function<String, String>属于单输入、单输出的函数类型,Spring Cloud Stream默认会根据函数的入参、出参数量匹配绑定索引,单入单出的函数最多只会识别in-0、out-0两组绑定,你配置的in-1、out-1超出了函数的参数数量,会被框架直接忽略。
解决方案(无需修改原有函数代码)
通过函数别名配置复用同一个函数逻辑,为每个别名单独配置独立的输入输出绑定即可,框架会为每个别名创建独立的消费者、生产者,所有别名都会指向你已定义的myFunction Bean。
调整后的完整yml配置
spring: cloud: stream: function: # 定义两个函数别名 definition: func1;func2 aliases: # 两个别名都映射到你已定义的myFunction Bean func1: myFunction func2: myFunction rabbit: bindings: func1-in-0: consumer: declareExchange: false bindQueue: false queueNameGroupOnly: true bindingRoutingKey: '"myExchange.test.request"' func1-out-0: producer: declareExchange: false bindQueue: false queueNameGroupOnly: true routingKeyExpression: '"myExchange.test.result"' func2-in-0: consumer: declareExchange: false bindQueue: false queueNameGroupOnly: true bindingRoutingKey: '"myExchange1.test.request"' func2-out-0: producer: declareExchange: false bindQueue: false queueNameGroupOnly: true routingKeyExpression: '"myExchange1.test.result"' bindings: func1-in-0: content-type: application/json group: MY_QUEUE func1-out-0: content-type: application/json destination: myExchange func2-in-0: content-type: application/json group: MY_QUEUE1 func2-out-0: content-type: application/json destination: myExchange1
配置生效后,框架会自动创建两个消费者分别监听MY_QUEUE、MY_QUEUE1,消息处理逻辑复用你已写的myFunction,处理后的结果会分别发送到myExchange、myExchange1,完全符合预期。
内容的提问来源于stack exchange,提问作者Thanos M
相关产品推荐
相关产品推荐

