持久化和业务流程引擎

状态持久性、其管理和还原构成了业务流程引擎的许多基本功能的基础。 具体而言,持久性对于以下项的正确功能至关重要:

  • 脱水和解除冻结

  • 与计算机无关的执行和解除冻结

  • 补偿模型

  • 受控系统关闭

  • 恢复

    业务流程引擎会将正在运行的业务流程实例的整个状态保存在持久存储中,以便以后可以在内存中完全还原该实例。 状态包括:

  • 引擎的内部状态,包括其当前进度。

  • 维护状态信息并由业务流程使用的任何 .NET 组件的状态。

  • 消息和变量值。

持久性点

业务流程引擎将正在运行的业务流程实例的状态保存在不同点。 如果需要解除业务流程实例的冻结、从受控关机启动或从意外关闭中恢复,它将从最后一个持久性点运行业务流程实例,就像没有发生任何其他操作一样。 例如,如果收到消息,但在保存状态之前发生了意外关闭,则引擎不会记录它已收到消息,并在重新启动时再次接收消息。 在以下情况下,引擎将保存业务流程的状态:

  • 已到达事务范围的结束。

    • 引擎将状态保存在事务范围的末尾,以便明确定义业务流程应恢复的点,并在必要时正确执行补偿。

    • 如果持久性成功,业务流程将继续从范围的末尾运行;否则,将调用相应的异常处理程序。

    • 如果作用域是事务性和原子性的,则引擎将在提交时在原子范围的末尾保存状态。

    • 如果作用域是事务性的且长时间运行,则引擎将生成一个新事务,并在作用域完成时保留运行时的完整状态。

  • 已到达调试断点。

  • 发送消息。 唯一的例外是消息是从原子事务范围内发送的。

  • 业务流程以异步方式启动另一个业务流程,就像 “启动业务流程” 形状一样。

  • 业务流程实例已暂停。

  • 当业务流程引擎被要求关闭时,它将尝试保存控制信息以及所有正在运行的业务流程实例的当前状态,以便在再次启动时可以继续运行它们。 如果引擎在保存当前状态时失败,则引擎将从关闭前发生的最后一个持久性点恢复业务流程实例。 这适用于处于受控状态的系统关闭以及异常终止。

  • 引擎确定实例应解除冻结。

  • 业务流程实例已完成。

序列化

业务流程引用的所有对象实例直接或间接 (为通过其他对象) 必须可序列化才能持久保存业务流程状态。 有两种例外情况:

  • 可以在原子事务中声明不可序列化的对象。 可以执行此操作,因为原子范围不包含持久性点。

  • System.Xml。XmlDocument 不是可序列化的类;它作为特殊情况进行处理,可在任何位置使用。

注意

若要持久保存 .NET 对象,必须将其标记为可序列化。

注意

不能使用标准 .NET 序列化过程持久保存 COM 对象。 如果要在原子事务外部调用 COM 对象,则必须将 COM 对象包装在 .NET 可序列化的 .NET 对象中,并知道如何持久保存和还原 COM 对象的状态。

系统关闭

当业务流程引擎被要求关闭时,它将尝试保存控制信息以及所有正在运行的业务流程实例的当前状态,以便在再次启动时可以继续运行它们。 如果引擎在保存当前状态时失败,则引擎将从关闭前发生的最后一个持久性点恢复业务流程实例。 这适用于处于受控状态的系统关闭以及异常终止。

恢复

引擎定期将业务流程实例的状态信息保存到持久存储,并在系统关闭时保存状态。

当业务流程实例因任何原因异常失败时,该实例可以从最后一个持久化状态恢复,并且可以继续像没有中断一样运行。 即使实例运行的原始服务器由于某种原因而服务中断,也是如此。实例只需在单独的计算机上继续运行。 由于这种多服务器恢复模式,不再需要聚类分析。

另请参阅

业务流程冻结和解除冻结