Spring集成:动态切换路由

时间:2019-03-15 13:32:47

标签: spring-integration spring-integration-dsl

基于spring集成的转换器使用来自一个系统的消息,检查,转换并将其发送给另一个系统。

如果目标系统关闭,我们将停止入站适配器,但也希望在本地持久保存或转发当前“正在进行中”的转换消息。为此,只需将消息从普通输出通道动态重新路由到某个“备份”通道。

docs中,我仅找到了基于消息头路由消息的选项(因此,在进行流操作之前的某个步骤中,一旦目标系统不可用,我将不得不动态添加消息),或者基于在有效载荷类型上,这不是我的情况。动态添加一些标头,然后将其过滤出管道,或者在反序列化过程中,对于我来说,似乎仍然不是最好的方法。我希望能够打开一个开关(在某个内部事件上),然后将这些“运行中”消息重新路由到“备份”通道。

实现此目标的最佳SI方法是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

路由器不仅可以基于有效负载类型或某些标头。实际上,您可以通过常规的POJO方法调用来返回通道,其名称或某些映射的路由键。该POJO方法确实可以检查某些内部系统状态并生成此路由键。

因此,您在路由器配置中可能会有以下内容:

.route(myRouter())

您的myRouter如下所示:

@Bean
MyRouter myRouter() {
   return;
}

及其内部代码可能是这样的:

public class MyRouter {


    @Autowired
    private SystemState systemState;

    String route(Object payload) {
       return this.systemState.isActive() ? "successChannel" : "backupChannel";
    }
}

同样可以实现一个简单的lambda定义:

 .<Object, Boolean>route(p -> systemState().isActive(),
                  m -> m.channelMapping(true, "sucessChannel")
                         .channelMapping(false, "backupChannel"))

还...

private final AtomicBoolean switcher = new AtomicBoolean();

@Bean
public IntegrationFlow flow() {
    return IntegrationFlows.from(() -> "foo", e -> e.poller(Pollers.fixedDelay(Duration.ofSeconds(5))))
            .route(s -> switcher.get() ? "foo" : "bar")
            .get();
}