EasyQuartz的使用,让后台任务合理并有序的执行

分类: NetCore

我们在(API或者WEB)项目中,如果想执行后台任务,请勿使用Timer,因为对Timer的管理显得不是太友好,做一些循环的任务的话没问题,但如果是指定时间任务,如果控制不严谨的话会显得很费力。
我们更不要在项目中使用Task执行后台任务,因为一旦请求完毕,那么资源会被释放。此时Task就失败了。
那么我们可以使用Quartz来管理我们的后台任务。让任务变得健康有序。

项目引用

  1. <PackageReference Include="XUCore.NetCore" Version="1.0.9" />

源码:EasyQuartz

引用:

  1. using XUCore.NetCore.EasyQuartz;

在线配置Cron任务

https://qqe2.com/cron

Statup中注册Quartz服务

  1. services.AddEasyQuartzService();

注册好即可使用。

那么接下来我们写一个任务

以下任务只需要放到项目中即可顺利执行。

demo1

  1. [TriggerCron("0/5 * * * * ? *")] //设置任务为每5秒执行一次
  2. public class Test1Job : IJob
  3. {
  4. public Task Execute(IJobExecutionContext context)
  5. {
  6. Console.WriteLine($"{DateTime.Now} Test1Job");
  7. return Task.CompletedTask;
  8. }
  9. }

demo2

这个例子是我们根据不同的环境获取Cron表达式来执行任务

  1. public class Test2Job : EasyQuartzJob, IJob
  2. {
  3. private readonly IConfiguration _configuration;
  4. public Test2Job(IConfiguration configuration)
  5. {
  6. _configuration = configuration;
  7. }
  8. public override string Cron => _configuration["Test2JobCron"];
  9. public Task Execute(IJobExecutionContext context)
  10. {
  11. Console.WriteLine($"{DateTime.Now}我是 Test2Job");
  12. return Task.CompletedTask;
  13. }
  14. }

demo3

这个例子我们5分钟执行一次任务,并在任务中建立子任务。

  1. [StartNow]
  2. [TriggerCron("0 0/5 * * * ? ")]
  3. public class Test3Job : IJob
  4. {
  5. private readonly IJobManager _jobManager;
  6. public Test3Job(IJobManager jobManager)
  7. {
  8. _jobManager = jobManager;
  9. }
  10. public async Task Execute(IJobExecutionContext context)
  11. {
  12. Console.WriteLine($"{DateTime.Now}我是 Test3Job");
  13. await _jobManager.AddJobAsync(typeof(Test4Job), CronCommon.SecondInterval(2), "111111");
  14. }
  15. }
  16. [JobIgnore]
  17. public class Test4Job : IJob
  18. {
  19. private readonly IJobManager _jobManager;
  20. public Test4Job(IJobManager jobManager)
  21. {
  22. _jobManager = jobManager;
  23. }
  24. public Task Execute(IJobExecutionContext context)
  25. {
  26. JobDataMap dataMap = context.MergedJobDataMap;
  27. string jobId = dataMap.GetString("JobId");
  28. Console.WriteLine($"{DateTime.Now}Test4Job,参数{jobId}");
  29. //await _jobManager.RemoveJobAsync(typeof(Test4Job), jobId);
  30. return Task.CompletedTask;
  31. }
  32. }
标签: Nginx NetCore

上一篇: Web页面加速:Cache Http请求服务缓存计划

下一篇: NETCore RazorPages 静态生成方案

by 2023-08-07 23:49:07
篇笔记

学习笔记