iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0

介紹

類似Windows排程的一個套件,不過他有Dashboard可以看
可以用在商業用途

使用情境

簡單來說如果你需要定時的執行某一段程式就可以使用這個套件來幫你完成。

優點

  • Simple 開發簡易、安裝簡單、方便部署
  • Persistent 工作任務可存放於多種儲存裝置
  • Transparent 提供 Dashboard 可及時查看工作任務狀態
  • Reliable 執行失敗的工作任務有自動重試機制
  • Distributed 可分散部署多台以同時處理大量工作
  • 個別 Server 可設置同時處理數量以支援處理密集的工作任務

任務執行方式

  • Fire-and-forgot jobs: 站台啟動後自動執行一次
  • Delayed jobs: 可設定時間區間,每間格時間區間執行一次
  • Recurring jobs: 可設定Cron敘述,並重複執行多次
  • Continuations: 在某個job執行完後接續執行

版本

版本 價格
Open Free
Startup 500 / year
Business 1,500 / yea
Enterprise 4,500/ year

安裝方式

GitHub範例

安裝環境NET6
主要安裝兩個套件

  • Hangfire
  • Hangfire.MemoryStorage

目前範例是將hangfire的紀錄存在記憶體之中

先註冊AddHangfire及AddHangfireServer,並且在MideeleWave的地方加入UseHangfireDashboard

Backgroud job方法

  • Fire-and-forgot jobs: 站台啟動後自動執行一次
        // GET: api/<HangfireDemoController>
        [HttpGet]
        public IActionResult OneNigh()
        {
            // 第一招射後不理
            // fire and got:站台啟動後只會執行一次
            BackgroundJob.Enqueue(() => Debug.WriteLine("fire and got"));
            return Ok("射後不理");
        }
  • Delayed jobs: 可設定時間區間,每間格時間區間執行一次
        [HttpGet]
        public IActionResult DelaySchedule()
        {
            Debug.WriteLine($"API現在時間:{DateTime.Now}");

            BackgroundJob.Schedule(
                () => Debug.WriteLine($"由HangFire排程發送,時間:{DateTime.Now}"),
                TimeSpan.FromSeconds(3));

            return Ok();
        }
  • Recurring jobs: 可設定Cron敘述,並重複執行多次
        [HttpGet]
        public IActionResult TimedRepeat()
        {
            Debug.WriteLine($"API現在時間:{DateTime.Now}");
            //【 秒 分 時 日 月 周 年 】,其中年是可選型別,也就是說他如果在不設定年分的情況下是每年。
            RecurringJob.AddOrUpdate(
                 () => Debug.WriteLine($"API現在時間:{DateTime.Now}")
                 , "15 7 * * *");

            return Ok();

        }
  • Continuations: 在某個job執行完後接續執行

先取得jobId再使用ContinueJobWith,來撰寫前一分任務執行完後要做的事情。

        // GET: api/<HangfireDemoController>
        [HttpGet]
        public IActionResult Continuations()
        {
            // 第一招射後不理
            // fire and got:站台啟動後只會執行一次
            var jobid = BackgroundJob.Enqueue(() => Debug.WriteLine("fire and got"));
           
            BackgroundJob.ContinueJobWith(jobid,()=> Debug.WriteLine("two and got"));

            return Ok("接續射後不理");
        }

關於各類型架構、Dashboard權限設定、工作全重設定…等等之後會專門寫一篇文章跟大家講解

參考資料

Hangfire 官方網站
過去整理的Hangfire文章
本篇已同步發表至個人部落格
https://moushih.com/2022ithome05/


上一篇
玩轉C#之【Swagger 不是SWAG】
下一篇
玩轉C#之【軟體分層架構-三層式架構】
系列文
玩轉C# 進階學習之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言