挂起的实例管理
SuspendedInstanceManagement 示例演示如何管理已挂起的工作流实例。 WorkflowUnhandledExceptionBehavior 的默认操作为 AbandonAndSuspend
。 这意味着,在默认情况下,从 WorkflowServiceHost 中承载的某个工作流实例抛出的未处理异常会导致从内存中释放(放弃)该实例,而该实例的持久版本将被标记为已挂起。 已挂起的工作流实例在取消挂起之前无法运行。
此示例演示如何实现命令行实用工具来查询挂起的实例,以及如何为用户提供恢复或终止实例的选项。 在此示例中,工作流服务故意触发异常,导致它暂停。 然后,命令行实用工具可用于查询实例,然后恢复或终止实例。
演示
Windows Workflow Foundation (WF) 中带有 WorkflowUnhandledExceptionBehavior 和 WorkflowControlEndpoint 的 WorkflowServiceHost。
讨论
此示例中实现的命令行实用工具特定于 .NET Framework 4.6.1 中附带的 SQL 实例存储实现。 如果你有实例存储的自定义实现,则可以通过将示例中的 WorkflowInstanceCommand
实现替换为特定于实例存储的实现来调整此实用工具。
所提供的实现直接针对 SQL 实例存储区来运行 SQL 命令以列出挂起的实例,并依赖于添加到 WorkflowControlEndpoint 的 WorkflowServiceHost,以便恢复或终止实例。
设置、生成和运行示例
此示例要求启用以下 Windows 组件:
Microsoft Message Queues (MSMQ) Server
SQL Server Express
设置 SQL Server 数据库。
在 Visual Studio 命令提示符下,从 SuspendedInstanceManagement 示例目录运行“setup.cmd”,该脚本执行以下操作:
使用 SQL Server Express 创建持久性数据库。 如果持久性数据库已存在,则会将其删除并重新创建
设置数据库以实现持久性。
将 IIS APPPOOL\DefaultAppPool 和 NT AUTHORITY\Network Service 添加到在设置用于持久化的数据库时定义的 InstanceStoreUsers 角色。
设置服务队列。
在 Visual Studio 中,右键单击 SampleWorkflowApp 项目,然后单击 设置为启动项目。
按 F5编译并运行 SampleWorkflowApp。 这将创建所需的队列。
按 Enter 停止 SampleWorkflowApp。
通过从命令提示符运行 Compmgmt.msc 打开计算机管理控制台。
依次展开“服务和应用程序”、“消息队列”和“专用队列”。
右键单击 ReceiveTx 队列,然后选择 属性。
选择“安全”选项卡,并允许 每个人 有权 接收消息、速览消息和 发送消息。
现在,运行示例。
在 Visual Studio 中,按 Ctrl+F5 再次运行 SampleWorkflowApp 项目而不进行调试。 控制台窗口中将打印两个端点地址:一个用于应用程序端点,另一个来自 WorkflowControlEndpoint端点。 然后创建工作流实例,并跟踪该实例的记录将显示在控制台窗口中。 工作流实例将引发异常,导致实例暂停和中止。
然后,可以使用命令行实用工具对这些实例中的任何实例执行进一步操作。 命令行参数的语法如下所示:
SuspendedInstanceManagement -Command:[CommandName] -Server:[ServerName] -Database:[DatabaseName] -InstanceId:[InstanceId]
支持的命令包括:
Query
、Resume
和Terminate
。 只有Resume
和Terminate
才需要 InstanceId 开关。
清理(可选)
通过运行 Compmgmt.msc 打开计算机管理控制台。
依次展开“服务和应用程序”、“消息队列”和“专用队列”。
删除“ReceiveTx”队列。
若要删除持久性数据库,请运行cleanup.cmd。