![](/img/trans.png)
[英]How to assign a service to message-driven-adapter in Spring Integration?
[英]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.