我正在测试一个.NET Core 2.0应用程序,该应用程序使用Service Bus 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运行时收到终止信号时,它可以正常关闭。

UPDATE :这是来自上面的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();
    }
}

关于docker - 如何在Docker容器中保持.NET Core控制台应用程序的生命,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46867532/

10-16 23:56
查看更多