Longbow.Tasks 实战——任务持久化

莱莱  论坛元老 | 2025-3-27 15:33:27 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1902|帖子 1902|积分 5706

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原文地址 https://www.cnblogs.com/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.....必要注入服务
  1. builder.Services.AddTaskServices();
复制代码
NETFramework 4.5+
  1. // 程序入口调用
  2. TaskServicesManager.Init();
复制代码
使用例子
  1. 1 //立即执行,仅执行一次
  2. 2 TaskServicesManager.GetOrAdd<TasksDemo>("任务唯一标识");
  3. 3
  4. 4 //周期性任务 (1 分钟后间隔 5 秒执行2次任务)
  5. 5 var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build();
  6. 6
  7. 7 TaskServicesManager.GetOrAdd<TasksDemo>("任务唯一标识", trigger);
  8. 8
  9. 9 //支持cron表达式,间隔 5 秒循环执行任务
  10. 10 TaskServicesManager.GetOrAdd<TasksDemo>("任务唯一标识", TriggerBuilder.Build("*/5 * * * * *"));
  11. 11
  12. 12 //这里重点关注,可以让你的任务接收 serviceProvider 参数,这样就可以使用注入的服务了
  13. 13 TaskServicesManager.GetOrAdd("任务唯一标识", async (serviceProvider, token) =>
  14. 14 {
  15. 15     System.Console.WriteLine("任务唯一标识");
  16. 16     await Task.Delay(1000);
  17. 17 }, TriggerBuilder.Build("*/5 12 * * * *"));
复制代码
持久化

  这里我使用 .NET 8 为例子,主要使用的是 依赖项注入-键控服务
1、我们先定义一个任务接口
  1. public interface ITestService
  2. {
  3.     Task Run(IServiceProvider serviceProvider);
  4. }
复制代码
2、注册几个任务
builder.Services.AddKeyedTransient("Test1");
builder.Services.AddKeyedTransient("Test2");
builder.Services.AddKeyedTransient("Test3");
3、写一个 IHostedService,用于定时任务的添加
  1. 1 public class TestHostedService : IHostedService
  2. 2 {
  3. 3     private readonly IServiceProvider _serviceProvider;
  4. 4
  5. 5     public TestHostedService(IServiceProvider serviceProvider)
  6. 6     {
  7. 7         _serviceProvider = serviceProvider;
  8. 8     }
  9. 9
  10. 10     /// <summary>
  11. 11     /// 假设这里是从数据库中读取的定时任务
  12. 12     /// </summary>
  13. 13     public Dictionary<string, string> Servers = new Dictionary<string, string>()
  14. 14     {
  15. 15         //key为服务名称,value为cron表达式
  16. 16         ["Task1"] = "*/5 12 * * * *",
  17. 17         ["Task2"] = "*/10 12 * * * *",
  18. 18         ["Task3"] = "*/15 12 * * * *",
  19. 19     };
  20. 20
  21. 21     public async Task StartAsync(CancellationToken cancellationToken)
  22. 22     {
  23. 23         await using var scope = _serviceProvider.CreateAsyncScope();
  24. 24         foreach (var server in Servers)
  25. 25         {
  26. 26             // 根据服务名称获取服务
  27. 27             var testServices = scope.ServiceProvider.GetKeyedServices<ITestService>(server.Key);
  28. 28             if (testServices.Any())
  29. 29             {
  30. 30                 ///正常来说一个任务对应一个服务,这里只取第一个
  31. 31                 var testService = testServices.First();
  32. 32                 // 添加定时任务
  33. 33                 TaskServicesManager.GetOrAdd(server.Key, async (serviceProvider, token) =>
  34. 34                 {
  35. 35                     await testService.Run(serviceProvider);
  36. 36                 }, TriggerBuilder.Build(server.Value));
  37. 37             }
  38. 38         }
  39. 39     }
  40. 40
  41. 41     public Task StopAsync(CancellationToken cancellationToken)
  42. 42     {
  43. 43         Console.WriteLine("StopAsync");
  44. 44
  45. 45         return Task.CompletedTask;
  46. 46     }
  47. 47 }
复制代码
  代码就这么多,感谢各位大佬的观看!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表