Служба окна Topshelf выдает ошибку 1053 при попытке запустить службу
Я разработал службу Windows, используя Topshelf. это работает хорошо локально. Когда я развернул тестирование и попытался запустить сервис, он выдает мне следующую ошибку:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Тестовый сервер работает на Windows server 2012.
Это мой сервис запуска и остановки методов:
public void Start()
{
_logProvider.Info("Service started.");
StartScheduledJobs();
}
public void Stop()
{
_scheduler.Shutdown(true);
_logProvider.Info("Service stopped.");
}
private void StartScheduledJobs()
{
try
{
_scheduler.Start();
ScheduleDeleteJob();
}
catch (Exception ex)
{
_logProvider.Error("", ex);
}
}
Может кто-нибудь помочь мне, что может быть причиной с решением, пожалуйста?
Спасибо
8 ответов
После безуспешной попытки любого другого решения я нашел решение, которое решило мою проблему с тем же сообщением об ошибке.
public static int Main(string[] args)
{
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
//...
}
Здесь эта проблема была решена: https://github.com/Topshelf/Topshelf/issues/183
В двух словах: ваш метод Start() должен возвращать true при запуске службы.
Проблема в том, что вы начинаете работу службы в Start()
метод.
Это прекрасно работает во время разработки, но когда вы устанавливаете службу, диспетчер управления службами вызывает Start и ждет 30 секунд, пока он не вернется - если это произойдет, то считается, что служба успешно установлена.
Поскольку вы запускаете запланированные задания, однако, в методе Start он не возвращается в течение этого времени, и вы получаете эту ошибку.
Решение состоит в том, чтобы начать работу косвенно в Start и затем вернуться - запустить выделенный поток, чтобы сделать это, или использовать таймер, есть много вариантов.
Моя ситуация была намного легче решить и так просто!
Параметры службы в Program.cs не соответствуют параметрам, используемым для установки службы в ServiceInstaller.
Итак, в основном я сопоставил это в Program.cs:
x.SetServiceName(serviceName);
x.SetDisplayName(serviceDisplayName);
x.SetDescription(serviceDescription);
К параметрам, установленным в установщике службы.
Вуаля! Исправлена проблема.
Я не уверен, что полученное вами сообщение об ошибке является действительной ошибкой. Как отлаживать:
- Проверьте с журналами, что метод запуска начинается. Примечание: убедитесь, что путь к журналу указан, поскольку служба Windows может запускаться под другой учетной записью. Если у вас есть что-то вроде
${LOCALAPPDATA}
в пути приложения к файлу журнала вы будете озадачены, почему вы не ведете журналы по пути, который вы использовали во время разработки. - Убедитесь, что прошло более 30 секунд
StartScheduledJobs()
отделки. - Если ваш код в Start не выполняется, то что-то в
static void main(args [])
происходит до запуска службы окна, которая вызывает эту проблему. Эта проблема может возникнуть только при запуске MyService.exe. Я рекомендую удалить код до того, гдеHostFactory
обертывает ваш сервис.
Примечание: TopShelf имеет плагин log4net, который вы можете установить, чтобы отслеживать, где происходит исключение ( http://docs.topshelf-project.com/en/latest/configuration/logging.html).
Когда я впервые научился использовать Topshelf, я не упоминал об ускорении запуска. Ниже, если мой метод запуска был ранее
public void Start()
{ //instatntiate a bunch of object here, taking up too much time }
Вот как я изменил свой код, чтобы ускорить метод Start
public void Start()
{ RunStartUpTasksAysnc();} //put a reference of start instructions on stack then exit
private async Task RunStartUpTasksAysnc()
{
await Task.Run(()=>{//instatntiate a bunch of object here});
}
Вместо запуска группы конструкторов, занимающих отведенное время для запуска службы, он помещает задачи в стек для асинхронного выполнения.
В моем случае проблема была вызвана этой строкой
Console.Title = "Some application";
У меня была такая же ситуация... Через два дня отладки один коллега увидел, что мой путь к quartz_jobs.xml в App.config неверен.
неверный
<add key="quartz.plugin.jobInitializer.fileNames" value="quartz_jobs.xml" />
верный
<add key="quartz.plugin.xml.fileNames" value="~/quartz_jobs.xml" />
Ура!