Рабочий процесс Windows: рабочий процесс в стиле "синглтон"?
У меня есть рабочий процесс, который будет наблюдать за определенными базами данных и запускать другие рабочие процессы, когда он замечает триггер. Я хочу, чтобы в любой момент времени работал только один экземпляр этого рабочего процесса "наблюдателя"; в противном случае, если бы два или более работали, они оба заметили бы изменение и оба запустили один и тот же рабочий процесс, который не работал бы хорошо.
Этот рабочий процесс "наблюдателя" сохраняется. Итак... как мне сделать так, чтобы, если во время выполнения экземпляр этого рабочего процесса уже не сохранялся, он запускал его, но если он уже есть, просто используйте постоянный?
Почти звучит так, будто я могу создать небольшое консольное приложение, которое запускает один раз, и запускает рабочий процесс, который я хотел, а затем "реальная" среда выполнения просто вытягивает постоянную и никогда не пытается создать новую, но это звучит не очень элегантно,
2 ответа
Я рассматриваю эту проблему и для проекта, над которым я сейчас работаю. Однако мне кажется, что функция мониторинга БД не является обязанностью рабочего процесса.
Мы собираемся создать Сервис для добавления во время выполнения. Этот сервис будет генерировать события, которые рабочий процесс прослушивает в HandleEventActivity. Таким образом, рабочий процесс бездействует, сохраняется и остается таким до тех пор, пока на самом деле не потребуется выполнение реальной работы.
У нас была эта проблема в проекте некоторое время назад. Решение, которое мы придумали, состояло в том, чтобы разместить две среды выполнения; один с постоянными услугами и один без. Во время выполнения без службы персистентности мы выполняли несколько таких "рабочих процессов мониторинга", которые автоматически запускались при запуске хоста.
Вот как это было реализовано:
Во-первых, у нас был файл конфигурации, в котором мы настроили службу персистентности:
<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);
}
}