rabbitmq .NET核心-正常处理启动时的失败,并在下一个请求时重试

fkvaft9z  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(202)

我有一个在IIS上运行的.NET Core Web服务。作为启动的一部分,该服务将连接到RabbitMQ。但是,如果由于某种原因连接失败,则该服务将在启动过程中崩溃。
这种情况会发生很多次,直到IIS快速失败保护策略生效并关闭应用程序池。然后,需要手动重新启动才能使其再次运行。
是否可以在Main()方法中处理异常,并且在不启动应用的同时,防止IIS将其视为故障,从而避免快速故障保护?理想情况下,服务将在下一个传入请求时再次启动。
更新:
我自己弄明白了。基本上你可以停止应用程序,它会在下一个传入的请求时再次启动:

public static async Task Main(string[] args)
{
    var webHost = CreateHostBuilder(args).Build();

    try
    {
        webHost.Run();
    }
    catch (StartMessageBusException)
    {
        // If we cannot connect to RabbitMQ on startup then we want to
        // gracefully shut down the app. This way IIS will try to start the app again on the next request
        await webHost.StopAsync();
    }
}
c3frrgcw

c3frrgcw1#

这里的答案很好地描述了如何在asp.net核心webapi应用程序中设置RabbitMQ-Setup RabbitMQ consumer in ASP.NET Core application
我建议您在单例中进行异常处理和重试。

wko9yo5t

wko9yo5t2#

我们遇到了同样的问题。我们必须采取两个步骤:
1.通过调用await webHost.StopAsync();关闭所有后台作业。只是为了确保所有后台作业(包括侦听HTTP请求的WebHost)都正确结束。
1.通过调用Environment.Exit(-1);通知IIS应用程序执行已结束。如果您不发送退出代码,IIS 10将不会再次启动该进程。
完整示例:

public static async Task Main(string[] args)
{
    var webHost = CreateHostBuilder(args).Build();

    try
    {
        webHost.Run();
    }
    catch (StartMessageBusException)
    {
        await webHost.StopAsync();
        Environment.Exit(-1);
    }
}

相关问题