簡體   English   中英

Spring集成流程與常規服務和適配器

[英]Spring integration flow vs regular service and adapter

我有一些帶有SOAP服務的舊代碼。 現在,我正在為可能調用一個或多個SOAP操作的某些對象構建Rest API。 我一直在研究Spring Integration。 來自文檔

除了將細粒度的組件連接在一起之外,Spring Integration還提供了多種通道適配器和網關來與外部系統進行通信。

以上聲明聽起來很誘人。 我正在編寫Rest微服務控制器,Validation服務,REST請求到SOAP請求映射器和SOAP客戶端。 在某些情況下,當有多個調用時,我不得不編寫更多的代碼,並且在很多情況下確實編寫了代碼。

高層的Spring Integration看起來像是面向異步消息的框架。 我的問題是該呼叫或多或少需要是同步呼叫,而性能至關重要。 有沒有人使用Spring integration解決此問題,您能否分享您的經驗。

作為對Artem 答案的補充,值得注意的是,如果您要使用Spring Integration DSL之一 (Java,Groovy或Scala),則默認情況下,Spring Integration將選擇(同步) DirectChannel您的端點整合流程。 這意味着只要您的端點保持同步並且您依賴它們之間的默認通道,整個集成流程也將保持同步。

例如(在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客戶端調用之前指定適當的通道:

  @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,將並行處理下游流。

請注意,消息端點還可能根據其邏輯異步運行。

我已經使用Spring Integration在我的家庭和工作項目中構建同步集成流程,並且事實證明這是一個非常強大而靈活的解決方案。

Spring Integration中的頭等公民之一是MessageChannel抽象。 最簡單,同步且因此直接的方法調用是DirectChannel

不知道是什么讓您認為Spring Integration中的所有內容都是異步的。 實際上,除非您告訴自己是異步的,否則它總是直接的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM