我正在测试一个.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/