Longbow.Tasks 实战—任务持久化

原文地址 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…..需要注入服务

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 }

  代码就这么多,感谢各位大佬的观看!

来源链接:https://www.cnblogs.com/ysmc/p/18795934

© 版权声明
THE END
支持一下吧
点赞8 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容