基于spring集成的转换器使用来自一个系统的消息,检查,转换并将其发送给另一个系统。
如果目标系统关闭,我们将停止入站适配器,但也希望在本地持久保存或转发当前“正在进行中”的转换消息。为此,只需将消息从普通输出通道动态重新路由到某个“备份”通道。
在docs中,我仅找到了基于消息头路由消息的选项(因此,在进行流操作之前的某个步骤中,一旦目标系统不可用,我将不得不动态添加消息),或者基于在有效载荷类型上,这不是我的情况。动态添加一些标头,然后将其过滤出管道,或者在反序列化过程中,对于我来说,似乎仍然不是最好的方法。我希望能够打开一个开关(在某个内部事件上),然后将这些“运行中”消息重新路由到“备份”通道。
实现此目标的最佳SI方法是什么?谢谢!
答案 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();
}