Spring Integration 中使用 Togglz 实现动态路由的方案咨询
Spring Integration + Togglz 动态路由解决方案
问题根因
你当前的实现中,routeToRecipients的配置回调仅在集成流Bean初始化阶段执行一次,开关状态判断逻辑只在应用启动时运行,后续开关更新不会触发规则重算,因此路由规则是固定的。
最简实现方案
直接使用route方法传入动态路由函数,每次消息到达时都会重新执行开关判断,无需重启即可生效:
@Autowired private FeatureManager manager; @Bean public IntegrationFlow dynamicRouteFlow() { return IntegrationFlows .from("incoming-flow") // 路由函数会在每次消息路由时执行,实时读取开关状态 .route(payload -> manager.isActive(MyFeatures.A_B_TESTING) ? A_CHANNEL : DEFAULT_CHANNEL) .get(); }
保留收件人路由的实现
如果你需要保留routeToRecipients的结构(比如后续要扩展多收件人场景),可以为每个收件人添加动态消息选择器:
@Bean public IntegrationFlow dynamicRecipientRouteFlow() { return IntegrationFlows .from("incoming-flow") .routeToRecipients(route -> route // 开关开启时路由到A_CHANNEL .recipient(A_CHANNEL, message -> manager.isActive(MyFeatures.A_B_TESTING)) // 开关关闭时路由到默认通道 .recipient(DEFAULT_CHANNEL, message -> !manager.isActive(MyFeatures.A_B_TESTING)) ) .get(); }
两种实现都满足开关热更新的需求,不需要额外拆分集成流或新增过滤器,符合Java配置的开发习惯。
内容的提问来源于stack exchange,提问作者user3083022
相关产品推荐
相关产品推荐

