挂起的实例管理

SuspendedInstanceManagement 示例演示如何管理已挂起的工作流实例。 WorkflowUnhandledExceptionBehavior 的默认操作为 AbandonAndSuspend。 这意味着,在默认情况下,从 WorkflowServiceHost 中承载的某个工作流实例抛出的未处理异常会导致从内存中释放(放弃)该实例,而该实例的持久版本将被标记为已挂起。 已挂起的工作流实例在取消挂起之前无法运行。

此示例演示如何实现命令行实用工具来查询挂起的实例,以及如何为用户提供恢复或终止实例的选项。 在此示例中,工作流服务故意触发异常,导致它暂停。 然后,命令行实用工具可用于查询实例,然后恢复或终止实例。

演示

Windows Workflow Foundation (WF) 中带有 WorkflowUnhandledExceptionBehaviorWorkflowControlEndpointWorkflowServiceHost

讨论

此示例中实现的命令行实用工具特定于 .NET Framework 4.6.1 中附带的 SQL 实例存储实现。 如果你有实例存储的自定义实现,则可以通过将示例中的 WorkflowInstanceCommand 实现替换为特定于实例存储的实现来调整此实用工具。

所提供的实现直接针对 SQL 实例存储区来运行 SQL 命令以列出挂起的实例,并依赖于添加到 WorkflowControlEndpointWorkflowServiceHost,以便恢复或终止实例。

设置、生成和运行示例

  1. 此示例要求启用以下 Windows 组件:

    1. Microsoft Message Queues (MSMQ) Server

    2. SQL Server Express

  2. 设置 SQL Server 数据库。

    1. 在 Visual Studio 命令提示符下,从 SuspendedInstanceManagement 示例目录运行“setup.cmd”,该脚本执行以下操作:

      1. 使用 SQL Server Express 创建持久性数据库。 如果持久性数据库已存在,则会将其删除并重新创建

      2. 设置数据库以实现持久性。

      3. 将 IIS APPPOOL\DefaultAppPool 和 NT AUTHORITY\Network Service 添加到在设置用于持久化的数据库时定义的 InstanceStoreUsers 角色。

  3. 设置服务队列。

    1. 在 Visual Studio 中,右键单击 SampleWorkflowApp 项目,然后单击 设置为启动项目

    2. F5编译并运行 SampleWorkflowApp。 这将创建所需的队列。

    3. 按 Enter 停止 SampleWorkflowApp

    4. 通过从命令提示符运行 Compmgmt.msc 打开计算机管理控制台。

    5. 依次展开“服务和应用程序”、“消息队列”和“专用队列”

    6. 右键单击 ReceiveTx 队列,然后选择 属性

    7. 选择“安全”选项卡,并允许 每个人 有权 接收消息速览消息发送消息

  4. 现在,运行示例。

    1. 在 Visual Studio 中,按 Ctrl+F5 再次运行 SampleWorkflowApp 项目而不进行调试。 控制台窗口中将打印两个端点地址:一个用于应用程序端点,另一个来自 WorkflowControlEndpoint端点。 然后创建工作流实例,并跟踪该实例的记录将显示在控制台窗口中。 工作流实例将引发异常,导致实例暂停和中止。

    2. 然后,可以使用命令行实用工具对这些实例中的任何实例执行进一步操作。 命令行参数的语法如下所示:

      SuspendedInstanceManagement -Command:[CommandName] -Server:[ServerName] -Database:[DatabaseName] -InstanceId:[InstanceId]

      支持的命令包括:QueryResumeTerminate。 只有 ResumeTerminate 才需要 InstanceId 开关。

清理(可选)

  1. 通过运行 Compmgmt.msc 打开计算机管理控制台。

  2. 依次展开“服务和应用程序”、“消息队列”和“专用队列”

  3. 删除“ReceiveTx”队列

  4. 若要删除持久性数据库,请运行cleanup.cmd。