Hangfire

1. 概述

  • Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)
  • 支持持久性存储,开源且免费用于商业用途
  • Hangfire支持自动重试功能,后台作业执行过程中遇到问题,则会在延迟一段时间后自动重试

2. 基本特征和优点

Hangfire

3. 要求

  • Hangfire 适用于大多数 .NET 平台:.NET Framework 4.5 或更高版本、.NET Core 1.0 或更高版本,或与 .NET Standard 1.3 兼容的任何平台。您可以将其与几乎任何应用程序框架集成,包括 ASP.NET,ASP.NET Core,控制台应用程序,Windows服务,WCF以及社区驱动的框架,如Nancy或ServiceStack

4. 持久化

  • Hangfire将后台作业序列化并持久化到数据库中,服务宕机重启后正在执行的作业将被重新激活
  • 支持的数据库
    • SQLServer 2008R2以及更高版本,免费
    • PostgreSQL
    • MongoDB
    • Redis,收费

5. 后台作业类型

  • 单次执行
  • 延迟执行
  • 重复执行
  • 延续执行
  • 批量执行
  • 批量延续执行

6. 架构

  • Hangfire有三个主要部分组成:客户端、存储介质、服务端
    Hangfire
    • 客户端:创建任务,将任务序列化后保存到指定的存储介质
    • 存储介质:负责持久化任务
    • 服务器:一个单独的后台线程从存储介质中获取并处理任务

7. 集成 Asp.Net Core Web API 并持久化到SQLServer

  • 安装NuGet包
    dotnet add package Hangfire.Core
    dotnet add package Hangfire.SqlServer
    dotnet add package Hangfire.AspNetCore
    
  • 配置Hangfire
    • 打开Startup.cs,在ConfigureServices方法中注册服务
      public void ConfigureServices(IServiceCollection services)
      {
          services.AddHangfire(configuration => configuration
          .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
          .UseSimpleAssemblyNameTypeSerializer()
          .UseRecommendedSerializerSettings()
          .UseSqlServerStorage(App.Configuration["ConnectionStrings:HangfireConnection"], new SqlServerStorageOptions
          {
              CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
              SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
              QueuePollInterval = TimeSpan.Zero,
              UseRecommendedIsolationLevel = true,
              DisableGlobalLocks = true
          }));
      
          services.AddHangfireServer();
      }
      
    • 在Configure方法中配置仪表盘
      app.UseHangfireDashboard("/hangfire", new DashboardOptions
      {
          Authorization = new[] { new DashboardAuthorizationFilter() },
          DashboardTitle = "Zheng He"
      });
      
    • 运行项目导航到/hangfire
  • 创建单次执行任务
    BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
    
    • 该方法不会立即调用目标方法,而是运行以下步骤
      • 序列化方法信息及其所有参数
      • 根据序列化信息创建新的后台作业
      • 将后台作业保存到持久性存储
      • 将后台作业排队到其队列
      • 执行这些步骤后,该方法将立即返回给调用方。另一个Hangfire组件,称Hangfire Server,检查持久存储中排队的后台作业,并以可靠的方式执行它们
    • 排队作业由专用的工作线程池处理。每个工作线程调用以下进程
      • 获取下一个作业并将其隐藏起来
      • 执行作业及其所有扩展筛选器
      • 从队列中删除作业
    • 因此只有在处理成功后才会删除作业。即使某个进程在执行期间被终止,Hangfire 也会执行补偿逻辑,以保证每个作业的处理
  • 创建延迟执行任务
    BackgroundJob.Schedule(() => Console.WriteLine("Hello, world"),TimeSpanFromDays(1));
    
    • Hangfire Server会定期检查计划,以便将计划作业排队到其队列中,也可以通过控台手动触发。默认情况下定期检查的间隔15s,但可以通过在传递给构造器的选项上设SchedulePollingInterval属性来更改
      var options = new BackgroundJobServerOptions
      {
          SchedulePollingInterval = TimeSpan.FromMinutes(1)
      };
      var server = new BackgroundJobServer(options);
      
  • 创建重复执行任务
    RecurringJob.AddOrUpdate("easyjob", () => Console.Write("Easy!"), CronDaily);
    
  • 创建延续执行任务
    var jobId = BackgroundJob.Enqueue(() => Console.WriteLin("Fire-and-forget!"));
    //当上一个任务执行完成后,执行延续任务
    BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!");
    
  • 创建批量执行任务
    var batchId = Batch.StartNew(x =>
    {
        x.Enqueue(() => Console.WriteLine("Job 1"));
        x.Enqueue(() => Console.WriteLine("Job 2"));
    });
    
  • 创建批量延续执行任务
    Batch.ContinueBatchWith(batchId, x =>
    {
        x.Enqueue(() => Console.WriteLine("Last Job"));
    });
    
上一篇:asp.net-显示/隐藏列表的一部分


下一篇:CodeGo.net>如何手动添加项目到Repeater控件