2017-08-17 120 views
0

我有一個場景,需要同步Web服務在調用異步服務(使用相關標識以稍後識別此事件)後創建響應。異步服務會將結果放入緩存中。而且我的Web服務需要設置一個活動的輪詢器/偵聽器來等待具有相同相關ID的事件插入到緩存中。一旦記錄可用,Web服務就可以創建一個響應對象並將其發送給客戶端。通過Mule中的守護進程線程維護多個HttpRequests

現在,異步過程可能需要很長時間,這會導致我的Web服務的主線程空閒。 Web服務正在發展成爲一個騾子工作流程,以及確切的情況如下圖所示:

     |→ async service → update cache → end //Async thread 
Client--> myWebSvc | 
        |→ setup cache listener → onEvent() → respond to Client //Main thread

是否有騾子的方式,可以幫助我保持地圖這樣一個HTTPRequests的,並保持它們在守護線程?這將有助於在等待舊的響應時接受新的請求。

我已經開始關注Java NIO,但我無法想象如何將它與Mule工作流程集成。在mule中有沒有解決方案可以幫助我釋放主線程並將HttpRequest對象存儲在地圖中以便稍後調用?

更多細節: Web服務是用java實現的。騾子的工作流程是這樣的:

 

              |→ async subflow to invoke async process 
HTTP Request → CXF component → Java component| 
              |→ (sub flow) Java component to listen to events 

回答

0

從騾人一些基本的研究和指導後,我發現,騾子已經將非阻塞線程實現。在主要流程中,可以設置「可選處理策略」來實現此目的。

通過使用此策略,HTTP偵聽器線程將將接收到的有效內容傳遞給流中的下一個組件,並將線程返回到流式線程池。一旦收到響應,事件線程需要再次從線程池中獲取。 Mule Non-Blocking

:在MuleSoft文檔中提供

<flow name="sample-flow" processingStrategy="non-blocking"> 
    <http:listener config-ref="http-listener-configuration" 
        path="samplews" doc:name="http-ws-endpoint" allowedMethods="GET,POST"/> 
    <logger message="Received payload: #[message.payloadAs(java.lang.String)]" level="INFO" 
      doc:name="Payload Received"/> 
    <cxf:jaxws-service configuration-ref="CXF_Configuration" port="myAPI" service="myAPI" 
         serviceClass="org.sample.wshandler.SomeClass" soapVersion="1.2" doc:name="cxf-tradefeed-api"> 
     <cxf:inInterceptors> 
      <spring:ref bean="logger"/> 
     </cxf:inInterceptors> 
     <cxf:outInterceptors> 
      <spring:ref bean="logger"/> 
     </cxf:outInterceptors> 
    </cxf:jaxws-service> 
    <flow-ref name="wsImpl-sub-flow" doc:name="wsImpl-sub-flow"/> 
</flow> 

更多細節