Spring AMQP + RabbitMQ RPC:如何在单个类中按属性执行不同方法
单个Spring AMQP类按路由键路由到不同方法的实现方案
你想要的功能完全可以实现!Spring AMQP的@RabbitListener注解天生支持在同一个类里定义多个方法,每个方法对应不同的路由键绑定,完美匹配你的需求。
先聊聊你当前代码可能踩的几个小坑:
- Exchange类型不匹配:
@Exchange注解默认类型是topic,如果你的消息用精确路由键发送,换成direct类型会更稳妥(topic也支持精确匹配,但direct是专门做精确路由键匹配的); - 消息参数转换问题:如果消息体无法被Spring正确转换成
long类型,方法也不会触发,得确保消息转换器配置正确; - 绑定关系是否生效:如果队列
requests已经存在,可能需要手动确认绑定关系,或者让Spring帮你自动声明绑定。
下面给你一个完整的可运行示例,直接参考就行:
import org.springframework.amqp.rabbit.annotation.Exchange; import org.springframework.amqp.rabbit.annotation.Queue; import org.springframework.amqp.rabbit.annotation.QueueBinding; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class RequestMessageHandler { // 处理路由键为"doFunc1"的消息 @RabbitListener(bindings = @QueueBinding( value = @Queue(value = "requests", durable = "true"), exchange = @Exchange(value = "ourexchange", type = "direct"), key = "doFunc1" )) public String handleFunc1(long id) { System.out.println("Executing func1 with id: " + id); return "Processed by func1"; } // 处理路由键为"doFunc2"的消息 @RabbitListener(bindings = @QueueBinding( value = @Queue(value = "requests", durable = "true"), exchange = @Exchange(value = "ourexchange", type = "direct"), key = "doFunc2" )) public String handleFunc2(long id) { System.out.println("Executing func2 with id: " + id); return "Processed by func2"; } }
再给你几个关键注意事项:
- 发送消息时指定正确路由键:发送消息到
ourexchange时,设置路由键为doFunc1会触发handleFunc1,设置为doFunc2则触发handleFunc2; - 消息转换器配置:如果你的消息是JSON格式的数字,记得配置
Jackson2JsonMessageConverter,确保Spring能正确把消息体转成long类型; - 队列与绑定的声明:如果队列和Exchange已经提前创建好,可以在
@QueueBinding里加上declare = false,避免Spring重复声明导致冲突。
按照这个示例调整后,应该就能实现你想要的功能啦!
内容的提问来源于stack exchange,提问作者Chad
相关产品推荐
相关产品推荐

