我有一个场景需要同步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
答案 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