Longbow.Tasks 實戰—任務持久化
原文地址 http://www.rzrgm.cn/ysmc/p/18795934
之前寫過一個文章,是介紹Longbow.Tasks這個定時任務調度庫的,然后不少小伙伴問過我,怎么東西怎么用,也怪我,在那篇文章結尾我講過要出實戰的,后來拋之腦后了,實在慚愧。
簡單講下這個庫的情況,Longbow.Tasks 于Gitee 上開源,這個是開源地址:https://gitee.com/Longbow/Longbow.Tasks ,最主要的是改庫支持 NETFramework 4.5+ 與 NETCore 2.0+。
先來回顧一下怎么使用這個庫:
初始化
.NET Core 中,包括 .NET 5 .NET 6 .NET 7.....需要注入服務
builder.Services.AddTaskServices();
NETFramework 4.5+
// 程序入口調用 TaskServicesManager.Init();
使用例子
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 * * * * *")); 11 12 //這里重點關注,可以讓你的任務接收 serviceProvider 參數,這樣就可以使用注入的服務了 13 TaskServicesManager.GetOrAdd("任務唯一標識", async (serviceProvider, token) => 14 { 15 System.Console.WriteLine("任務唯一標識"); 16 await Task.Delay(1000); 17 }, TriggerBuilder.Build("*/5 12 * * * *"));
持久化
這里我使用 .NET 8 為例子,主要使用的是 依賴項注入-鍵控服務
1、我們先定義一個任務接口
public interface ITestService { Task Run(IServiceProvider serviceProvider); }
2、注冊幾個任務
builder.Services.AddKeyedTransient<ITestService, Test1Service>("Test1");
builder.Services.AddKeyedTransient<ITestService, Test2Service>("Test2");
builder.Services.AddKeyedTransient<ITestService, Test3Service>("Test3");
3、寫一個 IHostedService,用于定時任務的添加
1 public class TestHostedService : IHostedService 2 { 3 private readonly IServiceProvider _serviceProvider; 4 5 public TestHostedService(IServiceProvider serviceProvider) 6 { 7 _serviceProvider = serviceProvider; 8 } 9 10 /// <summary> 11 /// 假設這里是從數據庫中讀取的定時任務 12 /// </summary> 13 public Dictionary<string, string> Servers = new Dictionary<string, string>() 14 { 15 //key為服務名稱,value為cron表達式 16 ["Task1"] = "*/5 12 * * * *", 17 ["Task2"] = "*/10 12 * * * *", 18 ["Task3"] = "*/15 12 * * * *", 19 }; 20 21 public async Task StartAsync(CancellationToken cancellationToken) 22 { 23 await using var scope = _serviceProvider.CreateAsyncScope(); 24 foreach (var server in Servers) 25 { 26 // 根據服務名稱獲取服務 27 var testServices = scope.ServiceProvider.GetKeyedServices<ITestService>(server.Key); 28 if (testServices.Any()) 29 { 30 ///正常來說一個任務對應一個服務,這里只取第一個 31 var testService = testServices.First(); 32 // 添加定時任務 33 TaskServicesManager.GetOrAdd(server.Key, async (serviceProvider, token) => 34 { 35 await testService.Run(serviceProvider); 36 }, TriggerBuilder.Build(server.Value)); 37 } 38 } 39 } 40 41 public Task StopAsync(CancellationToken cancellationToken) 42 { 43 Console.WriteLine("StopAsync"); 44 45 return Task.CompletedTask; 46 } 47 }
代碼就這么多,感謝各位大佬的觀看!
本文來自博客園,作者:一事冇誠,轉載請注明原文鏈接:http://www.rzrgm.cn/ysmc/p/18795934

浙公網安備 33010602011771號