Spring Integration JavaDSL实现RabbitMQ动态路由键的问题
Spring Integration JavaDSL实现RabbitMQ动态路由键
问题原因
你之前的JavaDSL写法错误在于:构建IntegrationFlow时就尝试获取消息头,但此时还没有实际消息流经该Flow,因此无法拿到正确的路由键值。硬编码写法能生效是因为它是固定值,不需要依赖消息上下文。
正确实现方式
对应XML中的routing-key-expression="headers['routing-key']",JavaDSL提供两种等价实现方式:
方式一:使用SpEL表达式(与XML配置完全对应)
@Bean IntegrationFlow salesforceEventsFlow(MessageHandler messageHandler, RabbitTemplate rabbitTemplate) { return IntegrationFlows.from("rabbitChannel") .transform(messageHandler) .handle(Amqp.outboundAdapter(rabbitTemplate) .exchangeName("invoice") .routingKeyExpression("headers['routing-key']")) .get(); }
方式二:使用Java Function(贴合Java代码风格)
如果更倾向于用Java代码而非SpEL,可使用routingKeyFunction方法,在每条消息处理时动态提取路由键:
@Bean IntegrationFlow salesforceEventsFlow(MessageHandler messageHandler, RabbitTemplate rabbitTemplate) { return IntegrationFlows.from("rabbitChannel") .transform(messageHandler) .handle(Amqp.outboundAdapter(rabbitTemplate) .exchangeName("invoice") .routingKeyFunction(msg -> msg.getHeaders().get("routing-key").toString())) .get(); }
说明
这两种方式都会让AmqpOutboundAdapter在处理每条消息时,从当前消息的Header中动态获取路由键,效果与XML配置完全一致。
内容的提问来源于stack exchange,提问作者Samantha Catania
相关产品推荐
相关产品推荐

