Spring 集成中的动态路由

Dynamic routing in Spring Integration

我想使用 togglz 来决定我的流的路由

我的集成流程中有 FeatureManager

@Autowired
private FeatureManager manager

及以后:

 return IntegrationFlows
            .from("incoming-flow")
            .routeToRecipients(route -> {
                if (manager.isActive(MyFeatures.A_B_TESTING)) {
                    route.recipient(A_CHANNEL);
                } else {
                    route.recipient(DEFAULT_CHANNEL);
                }
            })

不幸的是,这不起作用,因为路由是在创建 bean 时决定的,这意味着要使其起作用,我必须在每次更改开关时重新启动我的应用程序。这违背了切换的目的。

我可以想办法做到这一点,通过创建过滤器和其他流程,但是有什么办法可以做到这一点吗?我找到了一些 Spring 的文档,但它似乎没有用,它是用 xml 编写的,我没有使用它。

你所做的真的不是为了运行时决定的。 recipient() 是添加一个映射到收件人列表路由器。您可能需要在运行时决定将当前消息路由到何处。为此,我建议查看普通 route() 及其功能支持:

.route(p -> manager.isActive(MyFeatures.A_B_TESTING) ? A_CHANNEL : DEFAULT_CHANNEL)

当我们需要根据选择器决定将消息发送到多个映射通道时,收件人列表路由器实际上适用于其他用例。好吧,这也可以通过常规路由器来完成,但是我们在这里遵循更正式的收件人列表路由器 EI pattern

您真正需要的是一个具有运行时评估和适当通道(或其名称)的普通路由器 return。

请指出让您感到困惑的文档,我们会尽力改进它。