C# 如何启动kill ASP.NET核心应用程序以重新启动docker容器
我有一个在docker容器中运行的简单ASP.NET核心Web API应用程序 此应用程序应处理HTTP请求并使用来自Kafka的事件。所以,在Startup.Configure方法中,我运行带有无限循环的专用线程来使用事件C# 如何启动kill ASP.NET核心应用程序以重新启动docker容器,c#,docker,asp.net-core,asp.net-web-api,async-await,C#,Docker,Asp.net Core,Asp.net Web Api,Async Await,我有一个在docker容器中运行的简单ASP.NET核心Web API应用程序 此应用程序应处理HTTP请求并使用来自Kafka的事件。所以,在Startup.Configure方法中,我运行带有无限循环的专用线程来使用事件 public void Consume() { Task.Factory.StartNew(async () => { try { while (true) {
public void Consume()
{
Task.Factory.StartNew(async () =>
{
try
{
while (true)
{
var eventMsg = _consumer.Consume();
await Handle(eventMsg);
}
}
catch (Exception ex)
{
_consumer.Close();
// log error
throw;
}
}, TaskCreationOptions.LongRunning);
}
然后在启动时
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseAuthentication();
app.UseMvc();
var consumer = app.ApplicationServices.GetRequiredService<KafkaConsumer>();
consumer.Consume();
}
它会停止所有未运行的应用程序和WebAPI
如何正确处理?若短,我需要在后台线程抛出异常,然后关闭应用程序自动重新启动容器。我不能添加应用程序。退出到消费方法,因为它是一个库,我不能更改代码
有没有其他方法可以从后台线程杀死应用程序
请让我知道,如果我需要添加更多信息之前关闭它
此应用程序应处理HTTP请求并使用来自Kafka的事件。所以,在Startup.Configure方法中,我运行带有无限循环的专用线程来使用事件
public void Consume()
{
Task.Factory.StartNew(async () =>
{
try
{
while (true)
{
var eventMsg = _consumer.Consume();
await Handle(eventMsg);
}
}
catch (Exception ex)
{
_consumer.Close();
// log error
throw;
}
}, TaskCreationOptions.LongRunning);
}
最重要的是使用托管服务。因此,您的代码如下所示:
public class KafkaConsumer : BackgroundService
{
public KafkaConsumer()
{
_consumer = ...;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(async () =>
{
try
{
while (true)
{
var eventMsg = _consumer.Consume();
await Handle(eventMsg);
}
}
catch (Exception ex)
{
_consumer.Close();
... // log error
throw;
}
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<KafkaConsumer>();
}
是这样的:
public class KafkaConsumer : BackgroundService
{
public KafkaConsumer()
{
_consumer = ...;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(async () =>
{
try
{
while (true)
{
var eventMsg = _consumer.Consume();
await Handle(eventMsg);
}
}
catch (Exception ex)
{
_consumer.Close();
... // log error
throw;
}
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<KafkaConsumer>();
}
这不是在ASP.NET核心应用程序中运行后台处理事件的正确方法。不管怎样,你为什么要这么做?Docker的全部要点是,它非常容易运行多个服务。提取所有后台逻辑,将其放入控制台应用程序中,并在其自己的容器中运行。是的,但它使用事件和更新缓存,由控制器读取。将缓存存储在一个公共位置,该位置可供后台服务和web应用程序读取。