как определить, что один экземпляр службы не работает, и запустить новый экземпляр - PullRequest
0 голосов
/ 29 октября 2010

Эй, у меня следующая ситуация: WinService, который обрабатывает некоторые вещи из очереди, записывает их в другие таблицы (во время обработки) и после его завершения удаляет запись и переходит к следующей.

Мне нужен механизм, чтобы определить, жив ли и работает экземпляр, а если нет, запускать или пробуждать второй экземпляр.

До сих пор я думал о том, чтобы иметь два экземпляра, каждый из которых пытаетсязабрать материал из очереди и обработать его (пытается, как в случае, если он может, например, keepAliveFlag не установлен или lastUpdateDate записи слишком давно).Может быть ситуация, когда они обрабатывают одну и ту же запись - это недостаток.

Для этого предложенного выше решения мне также понадобится своего рода механизм в случае, когда экземпляр пытается написать keepAliveFlag и не удается остановить.

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

Теперь вопрос: каков будет правильный шаблон для реализации этого?

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Сервисы одноразовые в системе Windows. Единственный способ поддержки нескольких экземпляров - установить несколько одинаковых двоичных файлов с разными именами служб.

Вы можете отслеживать состояние любой данной услуги, используя класс [ServiceController][1], используя Свойство Status для определения текущего состояния и принятия соответствующих мер.

0 голосов
/ 29 октября 2010

В настоящее время одна из моих команд делает следующее:

  • На каждом компьютере установите экземпляр монитора (сам по себе служба Windows).
  • Этот монитор читает(из центральной базы данных) список локальных служб , которые он должен отслеживать.
  • Он также считывает рабочие / нерабочие часы для каждой локальной службы, которую он отслеживает.
  • Затем он контролирует каждую службу на наличие регулярных импульсов (и других сообщений о состоянии).
  • Если локальная служба не запущена в рабочее время, монитор запускает ее.
  • Если локальная службаработает, но не пульсирует, монитор перезапускает его.
  • Монитор регистрирует в базе данных состояние каждой службы и при необходимости отправляет информационные / предупреждающие / предупреждающие сообщения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...