基于弹簧集成的转换器消耗来自一个系统的消息,检查,转换并将其发送到另一个系统。
如果目标系统停机,我们会停止入站适配器,但也希望在本地保留或转发当前“正在进行中”转换的消息。为此,只需将消息从正常输出通道重新路由到某些“备份”通道动态。
在docs中,我发现只有根据它们的标题来路由消息的选项(所以在流程之前的某个步骤,我必须在targer系统不是availbale时动态添加它们),或者基于有效负载类型,这是不是我的情况。添加动态一些标题,然后将其过滤到管道,或在去/序列化过程中的情况似乎仍然不是我的最佳方法。我希望能够转换一个开关(在一些内部事件上),然后将这些“飞行中”消息重新路由到“备份”信道。
实现这一目标的最佳SI方法是什么?谢谢!
路由器不仅可以基于有效载荷类型或某些头。你真的可以有一个通用的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();
}