如果主服务失败并在 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);
}

如果您不能对该服务发出命令,您也可以使用 ServiceControllerStop 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;
        });
}

或者您的恢复必须是您重新启动该服务并启动该服务的命令。