[英]Graceful shutdown with Hangfire as a Windows service
我有一个 Hangfire 工作人员设置为 Windows 服务,我试图确保它正常关闭(即在关闭之前完成现有工作)。 我查看了现有的 Stack Overflow 问题和 Hangfire 文档,它似乎没有关于如何将 Hangfire 设置为 .NET 5 的 Windows 服务的文档。这是我现有的代码:
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder => builder.AddJsonFile("appsettings.json", optional: false))
.ConfigureServices((hostContext, services) =>
{
// Register services with container
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(hostContext.Configuration.GetConnectionString("Hangfire"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true
}));
services.AddHangfireServer(config =>
{
config.Queues = new[] { "myqueue" };
});
})
.UseNLog()
.UseWindowsService();
最近我遇到了关于 Hangfire 正常关机的类似问题。 使用优雅关闭的官方方法是在队列和工作人员中使用Cancellation Token 。
如果这不起作用,您可以在关闭时重新安排所有作业以延长关闭时间:
public void Configure([...], IHostApplicationLifetime applicationLifetime)
{
.
.
.
appLifetime.ApplicationStopping.Register(OnShutdownAsync);
}
private async void OnShutdownAsync()
{
Task task1 = Task.Factory.StartNew(() =>
{
var monitoring = JobStorage.Current.GetMonitoringApi();
Console.WriteLine(monitoring.ProcessingCount());
for (var i = 0; i < monitoring.ProcessingCount(); i++)
{
foreach (var processingJob in monitoring.ProcessingJobs(1000 * i, 1000))
{
BackgroundJob.Requeue(processingJob.Key);
}
}
Console.WriteLine(monitoring.ProcessingCount());
});
Task task2 = Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromSeconds(45)));
Task.WaitAny(task1, task2);
Console.WriteLine("All threads complete");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.