Hangfire


1. 概述

  • Hangfire是一個開源的.NET任務調度框架,提供了內置集成化的控制台,可以直觀明了的查看作業調度情況,並且Hangfire不需要依賴於單獨的應用程序執行(如:windows服務,window計划)
  • 支持持久性存儲,開源且免費用於商業用途
  • Hangfire支持自動重試功能,后台作業執行過程中遇到問題,則會在延遲一段時間后自動重試

2. 基本特征和優點

基本特征和優點

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有三個主要部分組成:客戶端、存儲介質、服務端
    架構
    • 客戶端:創建任務,將任務序列化后保存到指定的存儲介質
    • 存儲介質:負責持久化任務
    • 服務器:一個單獨的后台線程從存儲介質中獲取並處理任務

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"));
    });
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM