十六、.net core(.NET 6)搭建基於Redis的Hangfire定時器


搭建基於Redis的Hangfire定時器

 

Hangfire的定時配置信息會自動生成在指定到數據庫內,包括關系型數據庫或非關系型數據庫內。目前為止,它在RedisOracle上面,可以支持最短15秒的定時周期,其他數據庫是分鍾級別到。以下使用Hangfire+Redis來實現定時任務。

首先創建新的類庫項目 Wsk.Core.Hangfire,然后在Wsk.Core.Package包項目下引用hangfire有關的組件,包括 HangfireHangfire.CoreHangfire.RedisHangfire.Redis.StaskExchange

 

 

Wsk.Core.Hangfire項目下,新增Hangfire連接Redis的配置實體類:

 

 

 

在配置文件新增基於redishangfire的數據庫連接:

 

 

我的配置源碼:

"Hangfire": {
    "Config": {
      "ConnectionString": "127.0.0.1:6379,password=wesky123,connectTimeout=1000,connectRetry=1,syncTimeout=10000",
      "Db": 3 // 設置Hangfire使用的Redis的DB區
    }
  }

 

新建HangfireHelper類,並且新增一個用於讀取配置hangfire信息的方法,用來把讀取的數據,存儲在先前創建的實體類上:

 

 

在原先的實體類新增一個JobStorage類型的變量,用來存儲hangfire連接redisstorage

 

 

實體類源碼:

 public class HangfireConnectionOption
    {
        /// <summary>
        /// Redis連接字符串
        /// </summary>
        public static string connectionString { get; set; }
        /// <summary>
        /// redis的DB區,默認0
        /// </summary>
        public static int db { get; set; } = 0;

        public static JobStorage hangfireStorage;
    }
View Code

 

HangfireHelper類里面,新增連接redis的方法,並且把連接的對象賦值到上面新增實體類的變量上:

 

Helper類源碼:

 public class HangfireHelper: IHangfireHelper
    {
        private readonly ILogger<HangfireHelper> _logger;
        public HangfireHelper(ILogger<HangfireHelper> logger)
        {
            _logger = logger;
        }

        public void ReadHangfireConfig()
        {
            try
            {
                HangfireConnectionOption.connectionString = AppHelper.ReadAppSettings(new string[] {  "Hangfire", "Config", "ConnectionString" });
                HangfireConnectionOption.db = Convert.ToInt32(AppHelper.ReadAppSettings(new string[] {  "Hangfire", "Config", "Db" }));
            }
            catch (Exception ex)
            {
                _logger.LogError($"讀取hangfire配置信息出錯:{ex.Message}");
            }
        }

        public void HangfireStorage()
        {
            // 默認使用Redis進行Hangfire定時調度任務
            HangfireConnectionOption.hangfireStorage = new RedisStorage(HangfireConnectionOption.connectionString, new RedisStorageOptions
            {
                Db = HangfireConnectionOption.db,  // REDIS 的 DB區
                FetchTimeout = TimeSpan.FromMilliseconds(10), // 間隔多久讀取一次,最低為15秒,所以此處設置低於15秒也是會默認為15秒

            });

        }



        }
View Code

 

然后開放該類對應的接口:

 

 

然后為了方便,我把hangfire類庫項目全部通過autofac進行依賴注入注冊:

 

 

然后,在Hosted啟動項里面,新增Hangfire有關的配置信息的加載:

 

 

然后,在WskService里面,添加Hanfire的注冊和連接:

 

 

Wsk.Core.Hangfire類庫項目下,新建一個過濾器MyHangfireFilter,用於允許遠程訪問Hangfire的可視化面板:

 

過濾器源碼:

public class MyHangfireFilter : IDashboardAuthorizationFilter
    {
        public bool Authorize(DashboardContext context)
        {
            var httpContext = context.GetHttpContext();

            return true;  // 允許遠程無限制訪問   
        }
    }
View Code

 

最后,在Startup啟動類的Configure方法的最下邊,添加Hangfire的一些配置,以及加入上面的過濾器配置,用於可以跨服務器遠程訪問並且無需密碼;並且設置可視化面板為可讀,用於不提供手動觸發,如果需要嘗試手動觸發的,可以自己改為false:

 

 

現在寫一個定時任務做個試驗,新建類HangfireJobs,並且提供一個無參方法FirstJob以及對應接口:

 

 

Startupcnfigure方法最下方(配置hangfire以后),添加剛剛到定時任務,並設置了一個cron表達式,用來設置定時一秒執行一次的效果:

 

 

configure方法有關代碼:

   app.UseHangfireServer();
            app.UseHangfireDashboard("/hangfire", new DashboardOptions
            {
                IgnoreAntiforgeryToken = true,
                DashboardTitle = "Hangfire監控頁面",
                Authorization = new[] { new MyHangfireFilter() }, 
                IsReadOnlyFunc = (DashboardContext context) => true  //  設置為只讀
            });

            RecurringJob.AddOrUpdate<IHangfireJobs>("MyFirstJob", x => x.FirstJob(), "0/1 * * * * ? ");

 

啟動以后到結果:

 

 

可以看到,即使設置的是1秒,但是實際上是15秒才執行一次。我們打開可視化面看查看:

輸入啟動或發布的程序所在的ip:port/配置的看板,可在如下代碼進行更改:

 

 

可視化頁面如下所示:

 

 

頁面功能,還請各位大佬親自去探索,我就不一一介紹了。

最后,咱們看下hangfire自動寫入到redis的一些配置信息:

 

 

可以看到,redis連接選擇的BD3hangfire也自動把一系列配置信息寫到redis里面來了。而且程序上面的配置信息,我們也可以看見。

最后,定時任務的cron表達式,建議做成可配置,可別像我這樣寫死啊~~~

 

以上就是hangfire的全部內容,歡迎留下寶貴意見。


免責聲明!

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



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