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

抽象出站网关实现的最佳方法

杨经武
2023-03-14

我的spring integration应用程序需要能够通过简单的配置更改在Kafka和传统消息传递库(tibco rendezvous,spring integration不提供任何默认出站网关实现)之间按需切换<传统消息传递库提供了一些基本的请求/回复方法

Class LegacyTransport {
    Object request(Object query,String topic);
}

我试图找出提取出站消息网关(Kafka和legacy)的最佳方法,以便在我的主IntegrationFlow中(通过简单的配置更改)交换其中一个网关。

我目前的想法是使用以下方法作为我的主要集成流的一部分:

IntegrationFlowDefinition.gateway(IntegrationFlow flow)

首先创建两个具有相同名称的条件子流工厂bean,包装每个消息传递网关:

@ConditionalOnProperty(name="messaging",havingValue=[TIBCO/KAFKA])
@Bean
Function<String,IntegrationFlow> gatewaySubflowFactory() {
    return (String topic) -> ((IntegrationFlowDefinition<?> f) ->
        f.handle(
            [messaging library specific implementation here]
        ));
}

然后在我的主IntegrationFlow中使用该bean:

@Bean
public IntegrationFlow mainFlow(Function<String,IntegrationFlow> gatewaySubflowFactory)

    return IntegrationFlows.from(INPUT_CHANNEL)
        ...
        [do some useful processing here]
        ...
        .gateway(gatewaySubflowFactory.apply("some_topic"))
        ...
        [do more useful stuff with gateway output here]
        ...
        .get()

还有更好的(更简单的?)方法吗?
提前非常感谢您的专业知识、想法和时间。
问候

共有1个答案

公羊浩气
2023-03-14

任何出站网关只是更通用的服务激活器模式的特定实现。因此,您的LegacyTransport.request()可以包装到服务激活器配置中。这是第一个。

第二:不要忘记。永远不要忘记。Spring集成中的第一类公民之一是消息通道(MessageChannel)抽象:常规服务激活器,特别是Kafka的出站网关-与它们交互的主要点是为endpoint输入配置的消息通道。

因此,您的Kafka和Tibco流都可以从同一个通道开始。您的主流只是将其输出发送到该通道。有关更多信息,请参阅IntegrationFlowDefinition.channel()

这两个特定的流肯定都可以用@先决条件属性标记,以防止它们在运行时同时存在。

总结一下我的推理,这里有一些配置:

@Bean
public IntegrationFlow mainFlow() {

    return IntegrationFlows.from(INPUT_CHANNEL)
        ...
        [do some useful processing here]
        ...
        .gateway(OUTBOUND_GATEWAY_CHANNEL)
        ...
        [do more useful stuff with gateway output here]
        ...
        .get()

}

@ConditionalOnProperty(name="messaging",havingValue=KAFKA)
@Bean
public IntegrationFlow kafkaFlow() {
   return IntegrationFlows.from(OUTBOUND_GATEWAY_CHANNEL) 
              .handle(Kafka.outboundGateway())
              .get();
}

@ConditionalOnProperty(name="messaging",havingValue=TIBCO)
@Bean
public IntegrationFlow tibcoFlow() {
   return IntegrationFlows.from(OUTBOUND_GATEWAY_CHANNEL) 
              .handle(legacyTransport, "request")
              .get();
}
 类似资料:
  • 问题内容: 我已经在这个问题上苦苦挣扎了好几个月了,但是以前我从来没有需要探索所有可能的选择的情况。现在,我觉得该是时候了解各种可能性并创建自己的个人喜好了,以便在我即将进行的项目中使用。 首先让我勾勒出我要寻找的情况 我将要升级/重新开发已经使用了一段时间的内容管理系统。但是,我觉得多语言是对该系统的巨大改进。在我没有使用任何框架之前,我将在即将到来的项目中使用Laraval4。Laravel似

  • 问题内容: 但是那我该如何解决呢? 我的应用程序使用几种类型的文件,我想分配一些静态属性,例如对该文件类型的描述(例如“数据文件”,另一个是“配置文件”,等等)。显然,我会将其放入静态String中,以便无需实例文件即可访问描述(对GUI fi有用)。另一方面,显然所有文件类型都应具有一些通用方法,例如,显然我想从通用超类继承。 在超类中当然是抽象的。 尝试使用超类和接口的组合,但是存在类似的问题

  • 问题内容: 我们如何确定用于集合的方法的最佳实现(假设equals方法已被正确覆盖)? 问题答案: 最好的实现?这是一个难题,因为它取决于使用模式。 在几乎所有情况下,Josh Bloch的 有效Java项目8(第二版)中都提出了合理的良好实现。最好的办法是在那里查找,因为作者在那里解释了为什么这种方法很好。 简短版 1. 创建一个并分配一个非零值。 对于在方法中测试的每个字段 f,通过以下equ

  • 本文向大家介绍spring boot环境抽象的实现方法,包括了spring boot环境抽象的实现方法的使用技巧和注意事项,需要的朋友参考一下 在实际开发中,开发人员在编写springboot的时候通常要在本地环境测试然后再部署到Production环境,这两种环境一般来讲是不同的,最主要的区别就是数据源的不同。 在应用环境中,集成在容器的抽象环境模型有两个方面:profiles和properti

  • 问题内容: 我打算通过此库在android中实现Socket.io,用于基于聊天的应用程序。据我了解,该图书馆似乎还不错。我想知道如何始终保持整个应用程序中的 单个 套接字连接吗?在这里,我列出了实现的方法,其中我需要最好和稳定的方法。 三种方式 MainApplication 类扩展 应用程序 这样,我们就可以在 主线程 (或应用程序的生命周期)中维护套接字连接,并且只要活动需要套接字实例,我们

  • 问题内容: 假设我们有一个活动,该活动有很多视图要注册。 最常见的实现方法是让Activity-Subclass实现OnClickListener,如下所示: 我喜欢实现它的方式是在Activity-Subclass内部创建一个私有类,并让该内部类实现OnClickListener: 这样,代码看起来更加井井有条,易于维护。 此外,在谈论“ Is-a”,“ Has-a”关系时,后者似乎是一个好习惯