如何在 Docker 容器中保持 .NET Core 控制台应用处于活动状态



我正在测试一个 .NET Core 2.0 应用,该应用使用服务总线 SDK 从事件中心检索消息。我设置了一个控制台应用程序来执行此操作,并打算将该应用程序作为 Docker 容器运行。

此方法创建将读取消息的事件主机处理器:

    private static async Task MainAsync(string[] args)
    {
        Console.WriteLine("Registering EventProcessor...");
        var eventProcessorHost = new EventProcessorHost(
            EhEntityPath,
            PartitionReceiver.DefaultConsumerGroupName,
            EhConnectionString,
            StorageConnectionString,
            StorageContainerName);
        // Registers the Event Processor Host and starts receiving messages
        Console.WriteLine("Retrieving messages");
        await eventProcessorHost.RegisterEventProcessorAsync<EventProcessor>();
        Console.WriteLine("Sleeping");
        Thread.Sleep(Timeout.Infinite);
    }

由于在类 EventProcessor 中实现的事件处理器将是处理事件的事件处理器,因此我试图阻止控制台应用在处理器注册完成后退出。

但是,我找不到一种可靠的方法来保持应用程序的活动。如果我按原样运行此容器,则在输出窗口中看到的只是:

Registering EventProcessor...
Retrieving messages
Sleeping

并且不会收到任何消息。

谢谢大家的建议。

我遵循了这些文章,但最终得到了这个,它特别适用于 .NET Core 应用程序:

https://github.com/aspnet/Hosting/issues/870

我已经对其进行了测试,当应用程序收到来自 Docker 运行时的终止信号时,它可以正常关闭。

更新:这是上面GH问题链接中的相关示例:

public class Program
{
    public static void Main(string[] args)
    {
        var ended = new ManualResetEventSlim();
        var starting = new ManualResetEventSlim();
        AssemblyLoadContext.Default.Unloading += ctx =>
        {
            System.Console.WriteLine("Unloding fired");
            starting.Set();
            System.Console.WriteLine("Waiting for completion");
            ended.Wait();
        };
        System.Console.WriteLine("Waiting for signals");
        starting.Wait();
        System.Console.WriteLine("Received signal gracefully shutting down");
        Thread.Sleep(5000);
        ended.Set();
    }
}

相关内容

最新更新