首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以Hangfire作为Windows服务的优雅关闭

以Hangfire作为Windows服务的优雅关闭
EN

Stack Overflow用户
提问于 2022-01-10 15:27:35
回答 1查看 528关注 0票数 1

我有一个安装为Windows服务的Hangfire工作人员,我正在努力确保它优雅地关闭(即在关闭之前完成现有的工作)。我看过现有的堆栈溢出问题和Hangfire文档,它似乎没有关于如何将Hangfire设置为.NET 5的服务的文档。

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

发布于 2022-01-10 15:41:58

最近,我也遇到了一个类似的问题,那就是Hangfire公司优雅的关机。使用优雅关机的官方方法是在队列和工作人员中使用取消令牌

如果这样做不起作用,您可以在延长关闭时间时重新安排关闭时的所有作业:

代码语言:javascript
复制
 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");
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70654824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档