Установить сервисные зависимости после установки - PullRequest
6 голосов
/ 17 мая 2010

У меня есть приложение, которое работает как служба Windows. В базе данных хранятся различные настройки, которые проверяются при запуске службы. Я создал сервис для поддержки различных типов баз данных (SQL Server, Oracle, MySQL и т. Д.). Часто конечные пользователи предпочитают настраивать программное обеспечение для использования SQL Server (они могут просто изменить файл конфигурации с помощью строки подключения и перезапустить службу). Проблема в том, что когда их машина загружается, часто SQL Server запускается после моей службы, поэтому мои службы запускаются при запуске, потому что не могут подключиться к базе данных. Я знаю, что могу указать зависимости для своего сервиса, чтобы помочь диспетчеру служб Windows запускать соответствующие службы перед моим. Однако я не знаю, от каких сервисов зависеть во время установки (когда моя служба зарегистрирована), так как пользователь может позже изменить базы данных.

Итак, мой вопрос: есть ли способ для пользователя вручную указать зависимости службы на основе базы данных, которую они используют? Если нет, то какой подход к дизайну мне следует выбрать? Я думал о том, чтобы попытаться сделать что-то вроде ожидания через 30 секунд после запуска моей службы, прежде чем подключаться к базе данных, но это кажется по-настоящему нестабильным по разным причинам. Я также рассмотрел попытку «лениво» подключиться к базе данных; проблема в том, что мне нужно соединение сразу после запуска, так как база данных содержит различную жизненно важную информацию, которая нужна моему сервису при первом запуске. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 17 мая 2010

Dennis то, что вы ищете, это SC.exe. Это инструмент командной строки, который пользователи могут использовать для настройки служб.

sc [Servername] Command Servicename [Optionname= Optionvalue...]

более конкретно вы хотели бы использовать

sc [ServerName] config ServiceName depend=servicetoDependOn

Вот ссылка на командные опции для SC.EXE http://msdn.microsoft.com/en-us/library/ms810435.aspx

1 голос
/ 17 мая 2010

Возможное (далеко не идеальное) решение для кода:

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

bool connected = false;
while (!connected)
{
    try
    {
        connected = openDatabase(...);
    }
    catch (connection error)
    {
         // It might be worth waiting for some time here
    }
}

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

Поскольку вам нужен сервис для запускав разумные сроки этот код не может перейти в основную инициализацию.Вы должны принять меры к тому, чтобы ваша программа успешно «запускалась», но не выполняйте никакой обработки, пока этот метод не вернет connected = true.Этого можно добиться, поместив этот код в поток, а затем запустив фактический код приложения в событии «Завершить поток».

0 голосов
/ 17 мая 2010

Не прямой ответ, поставьте несколько пунктов, которые вы можете посмотреть

  1. Служба Windows может быть запущена автоматически с задержкой. Вы можете проверить этот вопрос в SO для получения дополнительной информации о нем.

Как запустить службу Windows как «Автоматический (отложенный запуск)»

  1. Проверьте это сообщение Как: кодировать сервисные зависимости
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...