0

我正在使用 asp.net mvc4 开发一个 Intranet 站点来管理我们的一些数据。该站点的一个重要功能是触发导入/导出作业。这些工作可能需要 5 分钟到 1 小时之间的任何时间。该站点的用户需要能够确定作业当前是否正在运行以及先前作业的状态。许多工作通常会包含有关重复数据的警告消息,并且这些警告需要在站点上可见。

我的计划是将这些长时间运行的进程实现为 asp.net 站点将与之交互的 WCF 工作流服务。我已经通过活动实现了很多业务逻辑,并使用简单的控制台应用程序对其进行了测试。我应该注意我正在使用关联句柄来根据站点上的特定“项目”对服务进行分区。

我的问题是如何通过查询活动作业的状态(如果存在)以及以前作业的警告消息来进行。我怀疑最好的方法是使用 AppFabric 跟踪服务并让我的 asp.net 查询 SQL 监控存储并报告当前状态。在设置 AppFabric 并添加自定义跟踪消息后,我遇到了一些问题。我的第一个问题是我无法弄清楚如何过滤掉未使用正确关联句柄的工作流实例,因为我只想显示特定项目的工作流。另一个问题是跟踪数据库可能会延迟很多,这会导致我在尝试确定工作流是否正在运行时出现问题。

另一种可能的解决方案是让工作流使用其当前状态和任何错误消息显式更新数据库。我倾向于这个解决方案,但可以使用一些专家建议。

TL;DR:我需要知道查询 WCF 工作流服务的执行状态和任何警告消息的最佳方法。

4

1 回答 1

0

由于您想在工作流完成后查询工作流状态和消息,我将首先创建一个表,您可以在其中将客户端发送的相关值转换为相关的工作流 ID。我将创建一个自定义活动来执行此操作,并在创建工作流的接收之后立即删除它。

接下来,我将创建客户端应用程序用来查询状态的常规 WCF 服务。此 WCF 服务可以查询 WF 持久性存储以查看给定的工作流是否仍在运行。如果是这样,活动书签列将告诉您工作流当前正在等待哪些 SOAP 消息。

就消息而言,您可以使用 AppFabric 跟踪基础架构来存储和检索它们,或者您可以创建自定义活动并将它们存储在您自己的数据库中。这真的取决于您是否也对生成的标准 WF 跟踪消息感兴趣。

检查运行工作流实例的更新:

将 IsRunning 消息添加到您的工作流程有几个缺点。对于一个,您需要确保一个分支继续循环并等待消息,但在另一个真正的工作流分支完成后立即停止。当然可能,但它会使工作流程复杂化,并且可能是错误的来源。而且由于它不是业务问题的一部分,就我而言,它在工作流程中确实没有位置。这也意味着您必须从磁盘加载工作流并将其持久化,只是为了告诉您它在那里。如果它已完成,您将需要等待故障以指示没有工作流实例。这通常意味着您会在默认情况下 60 秒后收到超时异常。添加限制,您的请求可能会排队,因为有太多其他工作流实例或正在处理的 SOAP 请求。因此超时可能意味着工作流实例存在但由于系统限制而无法访问。相反,我会选择简单的事情并检查实例存储中的记录是否仍然可用。来自活动书签列的附加信息将告诉您工作流正在等待什么,我过去曾使用这些信息通过启用/禁用 UI 元素来动态更新 UI。

于 2012-11-30T20:27:30.880 回答