Windows工作流程:“单身”式工作流程?

时间:2009-06-11 15:07:04

标签: workflow workflow-foundation

我有一个工作流程,可以观察某些数据库,并在注意到触发器时启动其他工作流程。我只希望这个“观察者”工作流程的一个实例能够在任何时间点进行;否则,如果有两个或两个以上的人在运行,他们都会注意到这一变化,并且都会触发相同的工作流程,这样做不会很好。

这个“观察者”工作流程是持久的。所以...我如何做到这一点,如果运行时没有这个工作流的实例已经存在,它会启动一个,但如果已经有一个,那么只使用持久的一个?

几乎听起来我可以创建一个小型的一次性控制台应用程序,启动我想要的工作流程,然后“真正的”运行时只是拉出持久的一个并且永远不会尝试创建一个新的,但这不是声音非常优雅。

2 个答案:

答案 0 :(得分:2)

我正在考虑这个问题以及我目前正在工作的项目。然而,在我看来,监控数据库的功能并不是工作流程的责任。

我们将创建一个添加到运行时的服务。此服务将引发工作流在HandleEventActivity中侦听的事件。通过这种方式,工作流程变得空闲,持续存在并保持这种状态,直到实际工作真正需要完成。

答案 1 :(得分:1)

我们不久前在一个项目中遇到过这个问题。我们提出的解决方案是承载两个运行时;一个有持久性服务而一个没有。在没有持久性服务的运行时中,我们运行了几种这样的“监视工作流”,这些工作在主机启动时自动启动。

这就是它的实施方式:

首先,我们在配置文件中设置了持久性服务:

<configuration>
    <configSections>
        <section name="RuntimeWithPersistence" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </configSections>
    <RuntimeWithPersistence>
        <CommonParameters/>
        <Services>
            <add type="System.Workflow.Runtime.Hosting.DefaultWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="[dbconnectionstring]" UnloadOnIdle="true"/>
        </Services>
    </RuntimeWithPersistence>
</configuration>    

在工作流主机应用程序中(剪切和编辑,但我认为我传达了这个想法):

public class WorkflowHost
{
    private WorkflowRuntime _runtime = null;
    private WorkflowRuntime _nonPersistingRuntime = null;

    private void SetupRuntime()
    {
        // create a new WorkflowRuntime that points out a config section
        // defining a persistence service
        _runtime = new WorkflowRuntime("RuntimeWithPersistence");
        // set up additional services to use
        _runtime.StartRuntime()

        // create a new WorkflowRuntime that does not point out a config section
        _nonPersistingRuntime = new WorkflowRuntime();
        // set up additional services to use
        _nonPersistingRuntime.StartRuntime()
        // start monitoring workflows in the non persisting runtime
        StartMonitoringWorkflows(_nonPersistingRuntime);
    }
}