使用Camel处理长期进程的方法

时间:2011-05-29 10:38:34

标签: messaging apache-camel bpm

我正在为基于Camel的小型流程引擎开发PoC。要求是具有执行一组后果步骤的能力,并且每个后果步骤可能需要数小时才能执行。在这种情况下,异步通信风格是明显的选择,但我很难让“过程”部分正确。

向外部系统发送消息时,我需要等待完成。只要可能需要花费很多时间,我就会在发送消息之后停止处理具体步骤,然后在完成消息后开始新的“工作”。因此,每个步骤的字面处理将作为从相同JMS队列开始的Camel路由处理,然后基于内容的路由器将根据消息标题或其内容决定应执行哪个具体逻辑。

然而,问题是如何避免消息丢失的可能性。例如,在具体步骤中,我正在发送消息并停止处理。外部系统由于某种原因没有处理消息,因此我的系统没有收到任何通知。这意味着进程被卡住,除非某些其他组件将生成消息以将其唤醒。

只要系统可以在任何时间点关闭,我必须构建逻辑以在重新启动后继续处理消息(这意味着某种消息持久性,重新传递和事务管理策略)。

所有这些问题加起来因此我想请求经验Camel冠军提供有关如何使用Camel设计此类逻辑的建议。我知道专用的BPM产品或ESB可能会更容易处理这个问题,但我不想让解决方案膨胀。

欢迎提出任何建议,特别是有助于简化解决方案的Camel功能。

2 个答案:

答案 0 :(得分:2)

Camel的BAM支持应该为您提供一些长期的流程支持(超时,错误处理方案等)。此外,JMStransactions将有助于提供可靠/持久的消息传递要求等。

祝你好运,如果你采取其他方法,请告诉我们......

答案 1 :(得分:2)

我建议Claim Check模式最适合长时间运行的外部调用之间的持久状态。在发送出站消息之前签入您的进程状态。

处理来自外部进程的非回复检测的一种方法是发布两条消息。一条消息转到外部进程,另一条消息转到内部队列。我将第二个调用进程超时消息。这是一个非常小的消息,只有相关ID和适当的到期时间。如果从外部进程收到进程,则接收进程将具有相关标识,并能够从进程超时队列中删除该消息。如果外部进程没有回复,那么进程超时队列的死信队列应该连接到警报管理员或采取适当的自动操作的骆驼路由,例如:检索索赔检查等。这应该允许持久状态,最小的开销和没有BPM工具,因此没有单点故障。