我有一个安装为Windows服务的Hangfire工作人员,我正在努力确保它优雅地关闭(即在关闭之前完成现有的工作)。我看过现有的堆栈溢出问题和Hangfire文档,它似乎没有关于如何将Hangfire设置为.NET 5的服务的文档。
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()
.Build()
.Run();发布于 2022-01-10 15:41:58
最近,我也遇到了一个类似的问题,那就是Hangfire公司优雅的关机。使用优雅关机的官方方法是在队列和工作人员中使用取消令牌。
如果这样做不起作用,您可以在延长关闭时间时重新安排关闭时的所有作业:
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");
}https://stackoverflow.com/questions/70654824
复制相似问题