.NET Core 實現後臺任務(定時任務)Longbow.Tasks 元件(三)

2022-07-23 18:05:49

原文連結:https://www.cnblogs.com/ysmc/p/16512309.html

  在上兩篇文章中,簡單介紹了怎麼使用 IHostedService 與 BackgroundService 實現定時任務,除此以外,我們還可以藉助一些第三方的元件實現定時任務,如大家比較熟悉的 Quartz,今天給大家介紹另外一個輕量級的定時任務元件 Longbow.Tasks,Longbow.Tasks 同樣是也是繼承了 IHostedService 噢,支援cron,該元件在 Gitee 上開源,感興趣的小夥伴可以去看看,傳送門

  值得一提的是,該元件同時支援 .NET Framework 與 .Net Core,下面看看官方說明:


Task 任務管理

任務服務管理是 BootstrapAdmin 內建的輕量級多執行緒安全的定時後臺任務模組,功能均內建於 Longbow.Tasks.dll 元件庫內,支援 NETFramework 4.5+ 與 NETCore 2.0+

設定

NETCore 容器注入

public void ConfigureServices(IServiceCollection services)
{
    services.AddTaskServices();
}

NETFramework 4.5+

// 程式入口呼叫
TaskServicesManager.Init();

組成

ITaskServicesFactory

後臺任務服務工廠介面,內部實現類為 TaskServicesFactory 也繼承了 IHostedService 所以元件通過 services.AddTaskServices(); 將任務服務注入到 NETCore 容器中

IScheduler

後臺任務排程介面,內部實現類為 DefaultScheduler 負責管理任務的排程

ITrigger

後臺任務觸發器介面,內部內建三個實現類分別為 (預設觸發器僅觸發一次)DefaultTrigger (週期性定時觸發器)RecurringTrigger (Cron表示式觸發器)CronTrigger 可以通過實現 ITrigger 介面根據實際業務需要自行擴充套件觸發器,元件預設提供 TriggerBuilder 負責建立任務觸發器

ITask

後臺任務業務類介面,僅一個 Task Execute(CancellationToken cancellationToken); 方法,後臺任務具體實現

TaskServicesOptions

後臺任務服務設定類

TaskServicesManager:

後臺任務服務人機互動操作類,提供所有後臺任務操作相關 API


 

  首先我們需要安裝這個元件包,搜尋 Longbow.Tasks 並安裝

   註冊該元件服務,然後就可以愉快的使用了;

builder.Services.AddTaskServices();

1、建立一個類,並且繼承 ITask,實現介面,寫上需要執行的任務程式碼:

public class TasksDemo : ITask
{
    public Task Execute(CancellationToken cancellationToken)
    {
        Console.WriteLine($"{DateTime.Now}");

        return Task.CompletedTask;
    }
}

2、在你需要啟動定時任務的地方,加上以下程式碼,按照自己的需要選擇中意的任務執行方式唄

 1 //立即執行,僅執行一次
 2 TaskServicesManager.GetOrAdd<TasksDemo>("任務唯一標識");
 3 
 4 //週期性任務 (1 分鐘後間隔 5 秒執行2次任務)
 5 var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build();
 6 
 7 TaskServicesManager.GetOrAdd<TasksDemo>("任務唯一標識", trigger);
 8 
 9 //支援cron表示式,間隔 5 秒迴圈執行任務
10 TaskServicesManager.GetOrAdd<TasksDemo>("任務唯一標識", TriggerBuilder.Build("*/5 * * * * *"));

  值得一提的是,這裡的 Cron 表示式並不支援年,下面我們看看 Longbow.Tasks 的官方說明:


Cron 格式說明

cron 表示式是用於定義固定時間、日期和間隔的掩碼。掩碼由秒(可選)、分鐘、小時、日、月和星期欄位組成。所有欄位都允許指定多個值,如果所有欄位都包含匹配的值,則任何給定的日期/時間都將滿足指定的 cron 表示式。

                                    Allowed values    Allowed special characters   Comment

┌───────────── second (optional)       0-59              * , - /                      
│ ┌───────────── minute                0-59              * , - /                      
│ │ ┌───────────── hour                0-23              * , - /                      
│ │ │ ┌───────────── day of month      1-31              * , - / L W ?                
│ │ │ │ ┌───────────── month           1-12 or JAN-DEC   * , - /                      
│ │ │ │ │ ┌───────────── day of week   0-6  or SUN-SAT   * , - / # L ?                Both 0 and 7 means SUN
│ │ │ │ │ │
* * * * * *


  有小夥伴可能要問了,那我怎麼停止定時任務的執行呢,在我們啟動任務的時候,是需要輸入一個任務的唯一標識的,我們可以通過這個標識,找到我們任務的執行器,並對其進行啟動、暫停、停止等操作:

var task = TaskServicesManager.Get("任務唯一標識");

  獲取範例後,我們來看看都提供了一些什麼樣的操作吧

 1 public interface IScheduler
 2 {
 3     /// <summary>
 4     /// 獲得 任務排程名稱
 5     /// </summary>
 6     string Name { get; }
 7 
 8     /// <summary>
 9     /// 獲得/設定 排程器狀態
10     /// </summary>
11     SchedulerStatus Status { get; set; }
12 
13     /// <summary>
14     /// 獲得 下一次執行時間 為空時表示不再執行
15     /// </summary>
16     DateTimeOffset? NextRuntime { get; }
17 
18     /// <summary>
19     /// 獲得 上一次執行時間 為空時表示未執行
20     /// </summary>
21     DateTimeOffset? LastRuntime { get; }
22 
23     /// <summary>
24     /// 獲得 上一次任務執行結果
25     /// </summary>
26     TriggerResult LastRunResult { get; }
27 
28     /// <summary>
29     /// 獲得 上一次執行異常
30     /// </summary>
31     Exception? Exception { get; }
32 
33     /// <summary>
34     /// 獲得 排程器建立時間
35     /// </summary>
36     DateTimeOffset CreatedTime { get; }
37 
38     /// <summary>
39     /// 獲得 排程器相關觸發器
40     /// </summary>
41     IEnumerable<ITrigger> Triggers { get; }
42 
43     /// <summary>
44     /// 獲得 排程器相關聯任務
45     /// </summary>
46     ITask? Task { get; }
47 }

  好了,這次的介紹就到這,下一篇將會使用 Longbow.Tasks 進行實戰介紹【手動狗頭】

寫在最後

Bootstrap Blazor 官網地址:https://www.blazor.zone

  希望大佬們看到這篇文章,能給專案點個star支援下,感謝各位!

star流程:

1、存取點選專案連結:BootstrapBlazor   

 

另外還有兩個GVP專案,大佬們方便的話也點下star唄,非常感謝:

  BootstrapAdmin 專案地址: