如何在Docker容器中保持.NET Core控制台应用程序的运行

8

我正在测试一个使用Service Bus SDK从事件中心检索消息的.NET Core 2.0应用程序。我设置了一个控制台应用程序来执行该操作,并打算将应用程序作为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

并且从未收到任何消息。


这在 Docker 外面正常工作吗?EhConnectionString 的值是什么? - Tarun Lalwani
也许这个可以帮到你?https://dev59.com/-prga4cB1Zd3GeqPlVmb#39247585 - Matt
1个回答

11

感谢大家提供的建议。

我遵循了那些文章,但最终得到了这个解决方案,它特别适用于.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();
    }
}

抱歉,但这对我不起作用。我在行之间添加了日志记录。它只记录“等待信号”。 - Yorro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接