2017-08-17 96 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> 

更多细节