java - Spring 集成流程与常规服务和适配器

标签 java spring soap spring-boot spring-integration

我有一些包含 SOAP 服务的遗留代码。现在我正在为一些可能调用一个或多个 SOAP 操作的对象构建 Rest API。我正在研究 Spring Integration。来自docs

In addition to wiring together fine-grained components, Spring Integration provides a wide selection of channel adapters and gateways to communicate with external systems.

以上说法听起来很诱人。我正在编写休息微服务 Controller 、验证服务、对 SOAP 请求映射器和 SOAP 客户端的休息请求。在某些情况下,当有多个调用时,我不得不编写更多的代码,而且在很多情况下我确实编写了代码。

Spring Integration 在高层看起来像是一个面向异步消息的框架。我的问题是调用或多或少需要是同步调用,性能至关重要。有没有人使用过 Spring integration 来解决这个问题,你能分享一下你的经验吗?

最佳答案

补充 Artem 的 answer值得注意的是,如果您打算使用其中一种 Spring Integration DSL(Java、Groovy 或 Scala),那么(同步)DirectChannel 将默认被选中通过 Spring Integration 连接集成流的端点。这意味着只要您的端点保持同步并且您依赖它们之间的默认 channel ,整个集成流程也会保持同步。

例如(在 Java DSL 中):

  @Bean
  public IntegrationFlow syncFlow() {
    return IntegrationFlows
        .from(/* get a REST message from microservice */)
        // here the DirectChannel is used by default 
        .filter(/* validate (and filter out) incorrect messages */)
        // here the DirectChannel is used by default too
        .transform(/* map REST to SOAP */)
        // guess what would be here?
        .handle(/* send a message with SOAP client */)
        .get();
  }

这绝对不意味着您永远受制于同步流。在任何一步,您都可以异步或并行。例如,如果您决定并行发送 SOAP 消息,您需要做的就是在调用 SOAP 客户端之前指定适当的 channel :

  @Bean
  public IntegrationFlow syncFlow() {
        // ... the same as above ...
        .transform(/* map REST to SOAP */)
        .channel(c -> c.executor(Executors.newCachedThreadPool()))  // see (1)
        .handle(/* send a message with SOAP client */)
        .get();
  }

(1) 从这一点开始,由于使用了 ExecutorChannel,下游流将被并行处理.

请注意,消息端点也可能异步运行 depending on their logic .

我已经使用 Spring Integration 在我的家庭和工作项目中构建同步集成流,事实证明它是一个非常强大而灵活的解决方案。

关于java - Spring 集成流程与常规服务和适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42775606/

相关文章:

java - Spring MVC 在 Google AppEngine 中初始化两次

java - 尝试应用 AttributeConverter 时出错

java - ConnectionPoolSetting 是针对单个 mongos 实例还是针对整个集群?

java - 使用java屏蔽某个网站

spring - 如何在 quartz 中 Autowiring ?

java - 在 apache karaf 上使用 apache Camel 蓝图的 Soap 请求失败

php - 在代理后面运行 PHP SoapServer

c# - 无法从 VS2017 中的 WSDL 生成代理

java - 如何将 float 数组转换为 byte[2] 数组并返回 java

java - 在 listView android 中设置 alpha 透明度