2009-06-09 54 views
1

我目前正在学习WF框架,所以请耐心等待;主要是我在寻找其中开始寻找,不一定是直接的答案。我似乎无法弄清楚如何开始研究我在Google中的内容。Windows工作流:持久性和轮询

比方说,我有一个简单的一步工作流程(比这更复杂,但为了简单起见)。此工作流程需要监视数据库中的某个记录,以查看数据库何时更改。当行更改时,我无法通过数据库中的触发器“推送”,因此我需要频繁地进行轮询。

此工作流程需要持久保存到数据库以防止重新启动,以及这是一个长时间运行的工作流程。我试图找出最好的方法让它每隔3分钟左右检查一次,并坚持数据库。框架的持久性功能是否允许这样做?它似乎是基于时间的。而且由于工作流程不会被外部事件重新唤醒,它是如何从数据库重新加载并检查它以前再次执行的同一步骤?它是否会在重新加载时自动尝试上次未执行的活动?

延迟附加的“while”活动可以工作,还是只能通过持久性服务来处理?

回答

1

我不确定你的意思是“通过持久性服务处理soley”吗?持久性仅指空闲工作流程的存储。

您可以在While循环中的Sequence中使用Delay和Code活动。在延迟时间内,工作流程将变为空闲状态,并可能在必要时保留。然而,取决于在坚持工作流程时需要多少状态以及/或者您在任何一个时间运行多少个这样的工作流程可能意味着需要更精简的方法。

更简洁的方法是将数据库外部化,并在发生期望的更改时让一些“数据库监视”工作流服务引发事件。该服务将被添加到Workflow运行时。

为此,您需要一个由Inteface和[ExternalDataExchange]属性定义的服务契约。该接口反过来定义了一个事件,即在检测到所需的DB更改时服务将会引发。它还定义了一个Workflow可以调用的方法,以指定该服务应该查找哪些更改。该方法应该接受一个实例GUID,以便在检测到DB更改时找到请求实例。

在您使用CallExternalMethodActivity调用此服务方法的工作流程中。然后流向监听事件的HandleExternalEventActivity。此时,工作流程将闲置并可以保留。它将一直存在,直到服务提出事件。

+0

我非常喜欢这种方法。它清除了我在这个框架中遇到的一些架构问题。谢谢! – Chris 2009-06-10 16:38:47