c# - 工作流持久性和书签作为工作流故障转移

标签 c# workflow-foundation-4 workflow-foundation workflow-activity sqlworkflowpersistencese

我有一组自定义事件,用于复杂的工作流程。

我想让它们(自定义事件)持久化,而无需让工作流处于空闲状态。它应该是一种故障转移系统,因此只要在执行工作流期间出现问题,它就可以是:

  • 被用户暂停(在任何时间),稍后从暂停的书签/点恢复(例如,用户注意到外部系统已关闭,他想暂时暂停工作流程)。
  • 如果出现未处理的异常,我们可以从最后一个书签/时间点重新开始执行
  • WorkflowApplication 宿主随时可能停止,我们可以从上一个书签/时间点重新开始执行

我已经在工作流持久性方面工作了几天,但我不确定我是否可以用它实现我的目标。为什么?

  • 我可以在每个自定义事件中使用阻止书签,但阻止工作流并重新启动它只是为了让它持久化看起来不太有前途。
  • 我可以使用非阻塞书签,但我无法在数据库中看到它们并从中恢复。

你能给我建议吗,工作流书签是去这里的方法吗?

我在 notblocking bookmarks 中看到了一些亮点,但我无法坚持它们并在以后恢复。你能给我一些提示,告诉我如何为以后的简历保留一个非阻塞书签吗?

编辑:

在 wf3 中有一个属性 PersistOnClose 足以满足我的要求。 在 wf4 中,它被替换为 Persist 事件,这也可能很有用,但是我不想在我已经很复杂的工作流中有额外的事件。

理想情况下,能够从 NativeActivityContext 执行 context.RequestPersist(callback) 会很棒,但是这个方法是内部的(它里面的所有东西都是在原始组件之外不可见。

最佳答案

这是我带来的:

  • 非阻塞书签不是一个选项。虽然非阻塞书签不会阻止创建事件的完成,但它也不会导致工作流实例变为空闲 - 这意味着它不会被持久化。一旦事件(创建它)完成,非阻塞书签就会被丢弃。只有在创建事件尚未完成时才能恢复此书签。
  • 使用 PersistOnCloseAttribute 不是一个选项,因为我使用的是 WF4 而此属性仅为 .NET 3.x WF。
  • 不能使用阻止书签,因为它们会阻止工作流的执行,这是不希望的。

解决方案是在每个自定义事件中使用Persist 事件(必须扩展可以安排子事件的NativeActivity):

//class field
Activity childActivity = new Persist();

为了让它工作,它必须作为 ImplmentationChild 添加到元数据中:

protected override void CacheMetadata(NativeActivityMetadata metadata)
{
     base.CacheMetadata(metadata);
     metadata.AddImplementationChild(this.childActivity);
}

最后一件事是从 Execute 方法安排子事件(无论在哪里,只有在调用事件完成后才会持久化*)。

protected override void Execute(NativeActivityContext context)
{
    //...
    context.ScheduleActivity((Activity)this.childActivity);
}

为了在未处理异常后保持工作流持续存在,必须将这段代码添加到 WorkflowApplication:

 application.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
 {
      return UnhandledExceptionAction.Abort;
 };

*从 Execute 方法返回并不一定意味着该事件已“完成”- 即事件中有阻塞书签(请参阅下面的缺点)。

这个解决方案有几个缺点:

  • 解决方案只保留工作流的一个状态(最后一个状态)。
  • 持久化只有在事件完成时才会发生。这意味着不能从事件中间完成坚持/恢复。
  • 它不适用于并行循环/序列——来自并行循环/序列的事件在整个并行事件完成后仍然存在。它适用于常规循环/序列。
  • 阻塞书签对这个解决方案有巨大的影响(如果它们是在创建事件或创建事件的其他子事件中创建的)。它们导致事件未完成,即使返回了 Execute 方法。最终 Persist 将执行(在事件完成之后或进入空闲状态之前)。

关于c# - 工作流持久性和书签作为工作流故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30750321/

相关文章:

c# - Microsoft Bot Framework 网络聊天 : Disable AdaptiveCards submit buttons of previous message

c# - C#面板/图片框的问题

wpf - DependencyProperty.Register() 或 .RegisterAttached()

c# - 如何获取服务引用以使用基于第 3 方 WSDL 的消息契约(Contract)正确生成,或者在 WF 服务项目中强制不使用消息契约(Contract)

c# - WF 4 : difference between ActivityAction or ActivityFunc and child activity

c# - 创建一个简单的异步工作流事件

c# - 如何在配置文件中放置一个 Windows 特殊文件夹

c# - 是否有 "Improving .NET Application Performance and Scalability"的更新版本?

tfs - 如何自定义 TFS2010 构建以在日志中打印消息

c# - 从 AsyncCodeActivity 中执行 AsyncCodeActivity