Spring集成:动态切换路由

问题描述 投票:0回答:1

基于弹簧集成的转换器消耗来自一个系统的消息,检查,转换并将其发送到另一个系统。

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

docs中,我发现只有根据它们的标题来路由消息的选项(所以在流程之前的某个步骤,我必须在targer系统不是availbale时动态添加它们),或者基于有效负载类型,这是不是我的情况。添加动态一些标题,然后将其过滤到管道,或在去/序列化过程中的情况似乎仍然不是我的最佳方法。我希望能够转换一个开关(在一些内部事件上),然后将这些“飞行中”消息重新路由到“备份”信道。

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

spring-integration spring-integration-dsl
1个回答
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();
}
© www.soinside.com 2019 - 2024. All rights reserved.