我在我的mule流程中有JMS,生产者从缓存中读取记录,放入队列,消费者使用消息并进行进一步处理。以下是理解的流程。
服务1(从文件中读取数据) - >服务2(将每行放入缓存中) - > JMS服务3(生产者逐行从缓存中读取数据并放入队列)和消费者从队列读取 - >服务4
在上面的流程中,从JMS组件开始,流程变为异步,因此只要生产者将所有记录放入队列响应中,就会返回到客户端,说明流程已完成,但消费者仍有可能消费消息。
我想从制作人处持进程以发回响应,直到消费者消费所有消息。
关于这个如何实现的任何想法?
答案 0 :(得分:0)
由于async独立地获取了确切线程和进程的副本,因此生产者可能会在消费者实际使用消息之前将消息放入队列中。
我可以想到一种将消息放入队列的过程,就是在它前面放一个sleep()
您可以使用Groovy组件并在其中使用sleep()
来保持流程或减慢流程
例如,如果您输入以下内容:
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[
sleep(10000);
return message.payload;]]>
</scripting:script>
</scripting:component>
在将消息放入队列之前,该过程将减慢一点并保持流量10000毫秒,直到另一方面消费者实际消耗它。
答案 1 :(得分:0)
如上所述轮询完成状态可能正常,但是在等待时间之后或者在处理完所有消息之后等待很长时间仍然存在某些事务未完成的风险。
根据本练习的最终目标,您可以利用Mule批处理,它已经实现了将入站请求拆分为单个消息,处理一个或多个消费者线程中的消息,跟踪处理的块和剩余的,并在处理完所有数据后报告结果/执行最终步骤。
如果您无法使用批处理并且需要将处理后的消息重新组合到单个列表或映射中,则可以让Collection Aggregator通过关联ID跟踪消息并设置超时。
实现它的粗略DIY方法是为JMS发布组件构建某种调度程序逻辑。它将所有消息提交给JMS,然后等待每个消费者/工作者线程(通过单独的JMS队列)响应具有相同相关ID的完成消息。然后,调度程序将跟踪内存或永久存储中的所有提交/处理的消息,并在确认批处理中的最后一条消息后或通过预定义的超时进行响应。这与Mule批次已经做的非常接近。
干杯! 迪马
答案 2 :(得分:0)
您可以使用交换模式值作为请求 - 响应,以便流等待来自JMS的响应。