網站需要開放使用者指定時間預約執行作業的功能,並需要簡單的介面查詢執行狀況。前陣子剛研究過 ASP.NET Core 的 IHostedService,但它限定 ASP.NET Core,而且查詢管理介面都需要自己刻;Quartz.NET 也蠻多人推的,API 簡潔擴充性高,但缺少現成的查詢管理介面。評估之後,決定重拾 Hangfire 上場作戰。

目標是允許使用者預約時間執行自訂作業,設定排程 API 類似這樣:

using Hangfire;
using System;
using System.Threading;

namespace DemoWeb.Models
{
    public class Worker
    {
        public static void QueueSchJob(DateTime schTime, string jobName, string args)
        {
            BackgroundJob.Schedule(() => ExecuteJob(jobName, args), schTime);
        }

        public static void ExecuteJob(string jobName, string args)
        {
            //... 這裡只是示範,什麼都不做,純裝忙 ....
            Thread.Sleep(new Random().Next(2000) + 500);
            // 搞定收工
            return;
        }
    }
}

這樣會有個問題:

工作清單裡的項目全都一模一樣,要點開才知道誰是誰:

要自訂工作名稱不難,方法是在 ExecuteJob 加上 [DisplayName("... {0} {1} ....")] Attribute,其中的 {0} {1}... 會套用 string.Format() 嵌入 ExecuteJob 方法的各參數,所以我們可用以下程式輕鬆實現自訂工作名稱:

    public class Worker
    {
        public static void QueueSchJob(DateTime schTime, string jobName, string args, string userId)
        {
            BackgroundJob.Schedule(() => ExecuteJob($"{userId} 建立於 {DateTime.Now:MM-dd HH:mm:ss}", jobName, args), schTime);
        }

        [DisplayName("排程作業: {0} - {1}")]
        public static void ExecuteJob(string creattor, string jobName, string args)
        {
            //... 這裡只是示範,什麼都不做,純裝忙 ....
            Thread.Sleep(new Random().Next(2000) + 500);
            // 搞定收工
            return;
        }
    }

修改後,從工作項目標題便可看出建立者、建立時間及工作名稱,總算清楚多了。

Tips of how to name the background jobs in Hangfire.


Comments

Be the first to post a comment

Post a comment