Сервисные зависимости от набора после установки

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

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

6
задан Dennis 17 May 2010 в 16:08
поделиться

3 ответа

Деннис то, что вы ищете, это 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

3
ответ дан 17 December 2019 в 07:01
поделиться

Непосредственный ответ, есть некоторые моменты, которые вы можете изучить

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

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

  1. Проверить это сообщение Как: Кодировать зависимости службы
0
ответ дан 17 December 2019 в 07:01
поделиться

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

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

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

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

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

1
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: