Рабочий процесс Windows: рабочий процесс в стиле «синглтон»? - PullRequest
2 голосов
/ 11 июня 2009

У меня есть рабочий процесс, который будет наблюдать за определенными базами данных и запускать другие рабочие процессы, когда он заметит триггер. Я хочу, чтобы в любой момент времени работал только один экземпляр этого рабочего процесса «наблюдателя»; в противном случае, если бы два или более работали, они оба заметили бы изменение и оба запустили один и тот же рабочий процесс, который не сработал бы хорошо.

Этот рабочий процесс "наблюдателя" сохраняется. Итак ... как мне сделать так, чтобы, если у среды выполнения не было экземпляра этого рабочего процесса, который уже был сохранен, он запускает его, но если он уже существует, просто используйте этот файл?

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

Ответы [ 2 ]

2 голосов
/ 12 июня 2009

Я рассматриваю эту проблему и для проекта, над которым я сейчас работаю. Однако мне кажется, что функция мониторинга БД не является обязанностью рабочего процесса.

Мы собираемся создать Сервис для добавления в среду выполнения. Этот сервис будет генерировать события, которые рабочий процесс прослушивает в HandleEventActivity. Таким образом, рабочий процесс бездействует, сохраняется и остается таким до тех пор, пока на самом деле не потребуется настоящая работа.

1 голос
/ 11 июня 2009

У нас была эта проблема в проекте некоторое время назад. Решение, которое мы придумали, состояло в том, чтобы разместить две среды выполнения; один с постоянными услугами и один без. Во время выполнения без службы персистентности мы выполняли несколько таких «рабочих процессов мониторинга», которые автоматически запускались при запуске хоста.

Вот как это было реализовано:

Сначала у нас был файл конфигурации, в котором мы настраивали службу персистентности:

<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);
    }
}
...