如果主服务失败并在 topshelf 中恢复,如何重新启动依赖服务
How to reatart depend service if the main aervice failed and recovered in topshelf
我正在使用使用 topshelf 创建的 windows 服务。有时此服务会停止。所以我希望它自动重启。所以我们在 topshelf 中有一个 onrecovery 选项。现在我的问题是,当这个服务从故障中恢复时,我应该能够重新启动另一个服务,因为我的这个服务失败了。我将如何实现?
首先,您应该让该服务依赖于其他服务,以确保它是 运行。
启动时,服务应向该服务发送命令以重新启动其逻辑。
对于接收命令的 Topshelf
服务,服务 class 应该实现 ServiceCustomCommand
或像这样设置它:
HostFactory.New(x =>
{
x.Service<MyService>(sc =>
{
sc.ConstructUsing(() => new MyService());
…
// Handle custom commands
sc.WhenCustomCommandReceived((service, control, command) =>
service.CustomCommand(control, command));
});
});
要向服务发送命令,您可以使用 ServiceController
.ExecuteCommand
:
using (var thatService = new ServiceController("ThatService"))
{
thatService.ExecuteCommand(0);
}
如果您不能对该服务发出命令,您也可以使用 ServiceController
到 Stop
and Start
服务:
using (var thatService = new ServiceController("ThatService"))
{
thatService.Stop();
SpinWait.SpinUntil(() =>
{
thatService.Refresh();
return thatService.Status == ServiceControllerStatus.Stopped;
});
thatService.Start();
SpinWait.SpinUntil(() =>
{
thatService.Refresh();
return thatService.Status == ServiceControllerStatus.Running;
});
}
或者您的恢复必须是您重新启动该服务并启动该服务的命令。
我正在使用使用 topshelf 创建的 windows 服务。有时此服务会停止。所以我希望它自动重启。所以我们在 topshelf 中有一个 onrecovery 选项。现在我的问题是,当这个服务从故障中恢复时,我应该能够重新启动另一个服务,因为我的这个服务失败了。我将如何实现?
首先,您应该让该服务依赖于其他服务,以确保它是 运行。
启动时,服务应向该服务发送命令以重新启动其逻辑。
对于接收命令的 Topshelf
服务,服务 class 应该实现 ServiceCustomCommand
或像这样设置它:
HostFactory.New(x =>
{
x.Service<MyService>(sc =>
{
sc.ConstructUsing(() => new MyService());
…
// Handle custom commands
sc.WhenCustomCommandReceived((service, control, command) =>
service.CustomCommand(control, command));
});
});
要向服务发送命令,您可以使用 ServiceController
.ExecuteCommand
:
using (var thatService = new ServiceController("ThatService"))
{
thatService.ExecuteCommand(0);
}
如果您不能对该服务发出命令,您也可以使用 ServiceController
到 Stop
and Start
服务:
using (var thatService = new ServiceController("ThatService"))
{
thatService.Stop();
SpinWait.SpinUntil(() =>
{
thatService.Refresh();
return thatService.Status == ServiceControllerStatus.Stopped;
});
thatService.Start();
SpinWait.SpinUntil(() =>
{
thatService.Refresh();
return thatService.Status == ServiceControllerStatus.Running;
});
}
或者您的恢复必须是您重新启动该服务并启动该服务的命令。