5

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

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

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

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

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

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

4

2 回答 2

2

Camel 的BAM支持应该为您提供一些长期存在的进程支持(超时、错误处理场景等)。此外,JMS事务将有助于满足可靠/持久的消息传递要求等。

祝你好运,如果你采用另一种方法,请告诉我们......

于 2011-06-02T16:34:09.327 回答
2

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

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

于 2011-10-21T18:44:22.823 回答