当前位置: 首页 > 知识库问答 >
问题:

Spring集成:动态切换路由

长孙阳成
2023-03-14

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

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

在文档中,我只找到了根据消息头路由消息的选项(因此,在流程之前的某个步骤中,一旦targer系统不可用,我将不得不动态添加这些消息),或者基于有效负载类型,这不是我真正的情况。动态添加一些标头,然后在管道中过滤掉它,或者在反/序列化期间,对我来说似乎仍然不是最好的方法。我更希望能够打开一个开关(在某些内部事件上),然后将这些“飞行中”的消息重新路由到“备份”通道。

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

共有1个答案

吴鸿禧
2023-03-14

路由器不仅可以基于有效负载类型或某些标头。您确实可以调用一个通用的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();
}
 类似资料:
  • 我有一个Spring集成流项目,它公开了一个Rest网关,在接收到Rest POST请求后,它会执行一些较小的逻辑。基于一些有效载荷参数,我想动态激活另一个Spring集成流,并将消息路由到该流中的指定通道,我可以在基于有效载荷的主流中发现该通道。子流将把响应消息放在主流中定义的指定通道中。 我如何才能实现这一点。

  • 可以在运行时向spring integration dsl注册MessageSources吗? 在我的例子中,我想创建多个FileReadingMessageSources(基于UI的输入),然后将有效负载发送到特定的通道/jms路由(从元数据或用户输入读取) 另一个问题是,是否可以动态注册IntegrationFlows?

  • 本文向大家介绍spring boot实现profiles动态切换的示例,包括了spring boot实现profiles动态切换的示例的使用技巧和注意事项,需要的朋友参考一下 具体做法: 1、首先在pom中添加profiles: dev指开发模式,prod指生产模式,如需其他模式,只需要添加profile即可. 2、在pom.xml的build中添加plugin: 该配置用来在打包的时候修改配置文

  • 当我向主题“Test19”发送任何消息时,配置的ServiceActivator“ProcessMessage”方法将两条消息显示为配置的两个客户,但这里的问题是,在添加到消费者上下文之前,我需要为每个客户加载入站配置文件…否则,我只能在控制台中得到一条消息…是正确的方式还是我需要在这里改变什么? 谢了。

  • null 如何在transform()步骤中添加Jaxb2Marshaller?

  • 我想在2个不同的场景之间切换: 问题是当我从场景2切换到场景1时,场景1中加载的所有图像都不在那里(这很明显,因为我正在创建一个新场景,而不是“加载”场景1。 当我从场景2切换到场景1时,有什么方法可以保留已经加载的图像吗? 场景1