Как сохранить службу Windows работающей после перезагрузки компьютера? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть Windows служба (с использованием SqlDependency), которая отправляет мне электронное письмо при каждом запуске и каждый раз, когда в мою таблицу продаж вставляется новая строка (в базе данных включена Service Broker). Я также пишу файл журнала для регистрации, когда служба запускается, данные вставляются в таблицу, если электронное письмо было успешно отправлено, и когда служба остановлена.

  • Когда я запустил вручную, все работало нормально.
  • Затем я выключил и снова включил свой P C и вставил данные в свою таблицу в базу данных, но ничего не произошло (электронная почта не отправлена ​​и нет регистрации в моем файл журнала).
  • Я перезапустил службу вручную, и она снова заработала.
  • Выключил и снова включил P C, и снова ничего не произошло.
  • Я сделал некоторые исследования и изменили тип инициализации на автоматический и попробовал еще раз. И больше ничего не произошло.
  • Я изменил тип инициализации на Automati c Задержка и попытался снова. Но это тоже не сработало, даже через 1 час после включения P C.
  • Теперь я вручную перезапустил службу, и файл журнала зарегистрировал, что служба остановилась и запустилась, я получил электронное письмо, которое служба запустилась, и после того, как я вставил данные в свою таблицу базы данных, и журнал регистрации, и сообщение электронной почты работали очень хорошо.

Каждый раз, когда это не работало, я проверял диспетчер служб в Windows и оно было помечено как «Выполняется».

Я не знаю, нужно ли мне настраивать что-то другое в моем коде или в свойствах моего сервиса. У кого-нибудь когда-нибудь возникала эта проблема?

РЕДАКТИРОВАТЬ

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

Я предполагаю, что служба может потерять базу данных соединение при перезапуске P C, поэтому SqlDependency не может обнаружить изменения. Имеет ли это какой-то смысл?

1 Ответ

3 голосов
/ 20 февраля 2020

Ваш сервис зависит от SQL Сервера, но ваш сервис, вероятно, запускается до того, как SQL Сервер был запущен или закончил запуск. Это может быть причиной сбоя SqlDependency.

Вы можете пометить службу как зависимую от SQL Сервера, что означает:

  • Windows не будет пытаться чтобы запустить службу до тех пор, пока SQL Сервер не запустится и не будет готов, и
  • При запуске службы Windows запустится SQL Сервер до запуска службы

Это может быть достигнуто в командной строке с помощью команды sc (которую необходимо будет запустить в командной строке администратора). Если ваш SQL экземпляр сервера называется MSSQLSERVER, а ваша служба - MyService, команда будет выглядеть следующим образом:

sc config MyService depend= MSSQLSERVER

Примечание. Пробел после = и до MSSQLSERVER имеет значение. Подробный синтаксис можно найти по адресу docs.microsoft.com .

После успешного выполнения этой команды вы увидите это при просмотре свойств вашего сервиса. в Панель управления> Администрирование> Службы:

enter image description here

...