加载包含延迟活动的任何持久工作流,当它是商店中的可运行实例时

时间:2011-09-28 13:53:57

标签: workflow-foundation-4

我们正在尝试加载和恢复有延迟的工作流程。我已经看到Microsoft使用store.WaitForEvents和LoadRunnableInstance来加载工作流的绝对延迟示例。但是,此处的工作流程已为人所知。

在我们的例子中,我们希望有一个事件等待store.WaitForEvents每隔5秒后检查是否有可运行的实例,如果只是加载并运行那个/那些特定的实例。有没有办法让我知道哪个工作流实例已准备就绪。

我们在数据库中维护工作流ID和与之关联的xaml,因此,如果我们知道工作流实例ID,我们可以将xaml映射到它,创建工作流,然后对其执行LOadRunnableInstance。

非常感谢任何帮助。

Microsoft示例(绝对延迟)

public void Run(){
    wfHostTypeName = XName.Get("Version" + Guid.NewGuid().ToString(), 
                               typeof(WorkflowWithDelay).FullName);

    this.instanceStore = SetupSqlpersistenceStore();

    this.instanceHandle = 
        CreateInstanceStoreOwnerHandle(instanceStore, wfHostTypeName);
    WorkflowApplication wfApp = CreateWorkflowApp();
    wfApp.Run();

    while (true) 
    {
        this.waitHandler.WaitOne();
        if (completed) 
        {
            break;
        }

        WaitForRunnableInstance(this.instanceHandle);
        wfApp = CreateWorkflowApp();

        try 
        {
            wfApp.LoadRunnableInstance();
            waitHandler.Reset();
            wfApp.Run();
        } 
        catch (InstanceNotReadyException) 
        {
            Console.WriteLine("Handled expected InstanceNotReadyException, retrying...");
        }
    }

    Console.WriteLine("workflow completed.");
}

public void WaitForRunnableInstance(InstanceHandle handle) 
{
    var events=instanceStore.WaitForEvents(handle, TimeSpan.MaxValue);
    bool foundRunnable = false;
    foreach (var persistenceEvent in events) 
    {
        if (persistenceEvent.Equals(HasRunnableWorkflowEvent.Value)) 
        {
            foundRunnable = true;
            break;
        }
    }

    if (!foundRunnable) {
        Console.WriteLine("no runnable instance");
    }
}

由于

Anamika

2 个答案:

答案 0 :(得分:2)

我在持久延迟活动和WorkflowApplicationHost方面遇到了类似的问题。结束创建我自己的“延迟”活动,其工作方式基本上与开箱即用的方式相同,(采用描述何时恢复工作流程的arg,然后书签本身)。虽然我没有在SqlInstanceStore中保存延迟信息,但是我的延迟活动在单独的数据库中创建了一条记录。 (类似于您用来跟踪工作流程ID和Xaml的那个)。然后我编写了一个简单的服务,该服务轮询该数据库是否存在过期延迟,并启动了必要工作流程的简历。

哦,延迟活动在书签恢复时从该数据库中删除了它的记录。

HTH

答案 1 :(得分:0)

我建议为您正在托管的每个工作流定义设置一个单独的SqlPersistenceStore。