我有一个对象列表,现在我正在foreach中处理。这个列表只不过是一串内部启动其他东西的ID。
<flow name="flow1" processingStrategy="synchronous">
<quartz:inbound-endpoint jobName="integration" repeatInterval="86400000" responseTimeout="10000" doc:name="Quartz" >
<quartz:event-generator-job/>
</quartz:inbound-endpoint>
<component class="RequestFeeder" doc:name="RequestFeeder"/>
<foreach collection="#[payload]" doc:name="For Each">
<flow-ref name="createFlow" doc:name="createFlow"/>
<flow-ref name="queueFlow" doc:name="queueFlow"/>
<flow-ref name="statusCheckFlow" doc:name="statusCheckFlow"/>
<flow-ref name="resultsFlow" doc:name="resultsFlow"/>
<flow-ref name="sftpFlow" doc:name="sftpFlow"/>
<logger message="RequestType #[flowVars['rqstType']] complete" level="INFO" doc:name="Done"/>
</foreach>
<logger message="ALL 15 REQUESTS HAVE BEEN PROCESSED" level="INFO" doc:name="Logger"/>
</flow>
我想并行处理它们。即对列表中的所有15个请求并行执行相同的4个flow-ref。这看起来很简单,但我还没弄清楚。任何帮助赞赏。
答案 0 :(得分:3)
分散 - 收集方法的替代方法是简单地拆分集合并使用VM队列来处理列表中的项目。如果您不需要等待并收集所有15个结果,这种方法可以更简单,如果您这样做,它仍然有效。
尝试这样的事情。 Mule自动使用线程池(more info)来运行您的流,因此下面的requestProcessor流将并行处理您的请求。
<flow name="scheduleRequests">
<quartz:inbound-endpoint jobName="integration" repeatInterval="86400000" responseTimeout="10000" doc:name="Quartz" >
<quartz:event-generator-job/>
</quartz:inbound-endpoint>
<component class="RequestFeeder" doc:name="RequestFeeder"/>
<collection-splitter />
<vm:outbound-endpoint path="requests" />
</flow>
<flow name="requestProcessor">
<vm:inbound-endpoint path="requests" />
<flow-ref name="createFlow" doc:name="createFlow"/>
<flow-ref name="queueFlow" doc:name="queueFlow"/>
<flow-ref name="statusCheckFlow" doc:name="statusCheckFlow"/>
<flow-ref name="resultsFlow" doc:name="resultsFlow"/>
<flow-ref name="sftpFlow" doc:name="sftpFlow"/>
</flow>
答案 1 :(得分:1)
我估计你仍然希望这四个流顺序运行,对吗? 如果不是这种情况,您可以随时更改线程配置文件。
您可以做的另一件事是将四个流包装在异步范围内,尽管您可能需要更换处理器。
无论如何,我认为你最好使用分散收集组件:
不需要for each scope将分割列表并在不同的线程中执行每个项目。您可以定义要并行运行的线程数(因此您不必旋转使用池的新线程)。
但最后一个注意事项是汇总所有已处理项目的结果。我认为您可以使用自定义聚合策略进行更改但不确定,请查看相关文档。
HTH
答案 2 :(得分:0)
Mule组件的Scatter-gather是易于并行处理的组件之一,一个简单的例子如下: -
<scatter-gather >
<flow-ref name="flow1" />
<flow-ref name="flow2" />
<flow-ref name="flow3" />
</scatter-gather>
因此,您想要并行执行的流程可以保留在
中答案 3 :(得分:0)
您说有4个流,但是列表包含5个流。如果要按顺序执行所有流,但要并行执行集合中的每个项目,则需要分割器,然后是包含所有(4/5)流的单独的vm流,如此处所述:https://support.mulesoft.com/s/article/Concurrently-processing-Collection-and-getting-the-results。 br />
如果希望循环内的流并行执行,则选择“散布-聚集”组件。
请务必清楚要实现的两件事中的哪一项,因为解决方案将大不相同。因此,基本区别在于,在分散收集中,单个消息被发送到多个收件人以进行并行处理,但是在拆分器聚合器中,单个消息被拆分为多个子消息,并分别进行处理,然后进行聚合。请参阅:http://muthurajud.blogspot.com/2016/07/eai-patterns-scattergather-versus.html