通过Mule中的守护程序线程维护多个HttpRequests

时间:2017-08-17 15:04:54

标签: java multithreading web-services asynchronous mule

我有一个场景需要同步Web服务在调用异步服务后创建响应(具有相关ID以便稍后识别此事件)。异步服务会将结果放在缓存中。我的Web服务需要设置一个活动的轮询器/监听器来等待具有相同相关ID的事件插入缓存中。一旦记录可用,Web服务就可以创建响应对象并将其发送给客户端。

现在,异步过程可能需要很长时间,这会导致我的Web服务的主线程空闲。 Web服务正在开发为mule工作流程,具体方案如下所示:

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

mule中是否有一种方法可以帮助我维护这样的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

1 个答案:

答案 0 :(得分:0)

经过Mule人员的一些基础研究和指导后,我发现mule已经整合了非阻塞线程的实现。在主要流程中,"可选处理策略"可以设置来实现这一目标。

通过使用此策略,HTTP侦听器线程将接收到的有效内容传递给流中的下一个组件,并将线程返回到流线程池。收到响应后,需要再次从线程池中获取事件线程。

<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>

MuleSoft文档提供了更多详细信息:Mule Non-Blocking