我有一个工作流程,可以观察某些数据库,并在注意到触发器时启动其他工作流程。我只希望这个“观察者”工作流程的一个实例能够在任何时间点进行;否则,如果有两个或两个以上的人在运行,他们都会注意到这一变化,并且都会触发相同的工作流程,这样做不会很好。
这个“观察者”工作流程是持久的。所以...我如何做到这一点,如果运行时没有这个工作流的实例已经存在,它会启动一个,但如果已经有一个,那么只使用持久的一个?
几乎听起来我可以创建一个小型的一次性控制台应用程序,启动我想要的工作流程,然后“真正的”运行时只是拉出持久的一个并且永远不会尝试创建一个新的,但这不是声音非常优雅。
答案 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);
}
}