Загрузка любого постоянного рабочего процесса, содержащего задержку, когда он является работоспособным экземпляром в хранилище - PullRequest
2 голосов
/ 28 сентября 2011

Мы пытаемся загрузить и возобновить рабочие процессы с задержкой. Я видел пример абсолютной задержки Microsoft для этого с использованием store.WaitForEvents и LoadRunnableInstance для загрузки рабочего процесса. Однако здесь рабочий процесс уже известен.

В нашем случае мы хотим, чтобы событие ожидало store.WaitForEvents через каждые, скажем, 5 секунд, чтобы проверить, существует ли работающий экземпляр, и если это так, только загружать и запускать этот / эти конкретные экземпляры. Есть ли способ узнать, какой экземпляр рабочего процесса готов.

Мы поддерживаем идентификатор рабочего процесса и связанный с ним xaml в нашей базе данных, поэтому, если бы мы могли знать идентификатор экземпляра рабочего процесса, мы могли бы сопоставить его с 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 ]

2 голосов
/ 05 декабря 2012

У меня была похожая проблема с действиями длительной задержки и WorkflowApplicationHost. Закончилось создание моего собственного действия «Задержка», которое работало по сути так же, как и «из коробки» (принимает аргумент, описывающий, когда возобновить рабочий процесс, а затем закладывает себя в закладки). Вместо того, чтобы сохранять информацию о задержке в SqlInstanceStore, моя Delay Activity создала запись в отдельном БД. (аналогично тому, который вы используете для отслеживания идентификаторов рабочих процессов и Xaml). Затем я написал простую службу, которая опрашивала эту БД на предмет истекших задержек и инициировала возобновление необходимого рабочего процесса.

О, и операция «Задержка» удалила свою запись из этой БД в резюме закладок.

НТН

0 голосов
/ 28 сентября 2011

Я бы предложил иметь отдельный SqlPersistenceStore для каждого определения рабочего процесса, которое вы размещаете.

...