代码之家  ›  专栏  ›  技术社区  ›  Haraldur

Hangfire在服务器重新启动时复制作业

  •  0
  • Haraldur  · 技术社区  · 7 年前

    所以我们有一个.NET核心API,它使用hangfire作为任务调度程序。

    启动时,我们的API启动以下函数:

    public void CreateTasks()
    {
        /* DATABASE TASKS */
        SyncDatabaseTask();
    
        /* SMS TASKS */
        SendSmsTask();
    
    }
    
    public void SendSmsTask()
    {
        var taskId = BackgroundJob.Schedule(() => _smsService.SendSms(), TimeSpan.FromMinutes(30));
        BackgroundJob.ContinueWith(taskId, () => SendSmsTask());
    }
    

    这将在启动时在Hangfire中创建作业SendSmsTask,并且在第一个作业完成之前不会启动第二个作业。

    然而,我们刚刚注意到的问题是,每当我们的API重新启动(例如服务器更新)时,现有的作业仍然在运行,并且正在添加新闻作业。

    因此,我们希望在启动时删除所有计划的或正在运行的作业。

    我已经看过文件了( http://docs.hangfire.io/en/latest/ )但没能找到解决这个问题的办法。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Pieter Alberts    7 年前

    这应该可以解决你的问题,只要注意这是未经测试的。

        private void RemoveAllHangfireJobs()
        {
            var hangfireMonitor = JobStorage.Current.GetMonitoringApi();
    
            //RecurringJobs
            JobStorage.Current.GetConnection().GetRecurringJobs().ForEach(xx => BackgroundJob.Delete(xx.Id));
    
            //ProcessingJobs
            hangfireMonitor.ProcessingJobs(0, int.MaxValue).ForEach(xx => BackgroundJob.Delete(xx.Key));
    
            //ScheduledJobs
            hangfireMonitor.ScheduledJobs(0, int.MaxValue).ForEach(xx => BackgroundJob.Delete(xx.Key));
    
            //EnqueuedJobs
            hangfireMonitor.Queues().ToList().ForEach(xx => hangfireMonitor.EnqueuedJobs(xx.Name,0, int.MaxValue).ForEach(x => BackgroundJob.Delete(x.Key)));
        }
    
        2
  •  0
  •   Lucas Lima    7 年前
                //Start Hangfire Server
            var varJobOptions = new BackgroundJobServerOptions();
            varJobOptions.ServerName = "job.fiscal.io";
            varJobOptions.WorkerCount = Environment.ProcessorCount * 10;
            app.UseHangfireServer(varJobOptions);
            app.UseHangfireDashboard("/jobs", new DashboardOptions {
                Authorization = new[] { new clsHangFireAuthFilter() }
            });
            //Remove Duplicte HangFire Server
            var varMonitoringApi = JobStorage.Current.GetMonitoringApi();
            var varServerList = varMonitoringApi.Servers().Where(r => r.Name.Contains("job.fiscal.io"));
            foreach( var varServerItem in varServerList) {
                JobStorage.Current.GetConnection().RemoveServer(varServerItem.Name);
            }
    
    推荐文章