asp.net mvc中长时间运行的工作流程

时间:2012-11-29 22:13:36

标签: asp.net-mvc-4 workflow-foundation-4

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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