我们在(API或者WEB)项目中,如果想执行后台任务,请勿使用Timer,因为对Timer的管理显得不是太友好,做一些循环的任务的话没问题,但如果是指定时间任务,如果控制不严谨的话会显得很费力。
我们更不要在项目中使用Task执行后台任务,因为一旦请求完毕,那么资源会被释放。此时Task就失败了。
那么我们可以使用Quartz来管理我们的后台任务。让任务变得健康有序。
项目引用
<PackageReference Include="XUCore.NetCore" Version="1.0.9" />
源码:EasyQuartz
引用:
using XUCore.NetCore.EasyQuartz;
在线配置Cron任务
Statup中注册Quartz服务
services.AddEasyQuartzService();
注册好即可使用。
那么接下来我们写一个任务
以下任务只需要放到项目中即可顺利执行。
demo1
[TriggerCron("0/5 * * * * ? *")] //设置任务为每5秒执行一次
public class Test1Job : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"{DateTime.Now} Test1Job");
return Task.CompletedTask;
}
}
demo2
这个例子是我们根据不同的环境获取Cron表达式来执行任务
public class Test2Job : EasyQuartzJob, IJob
{
private readonly IConfiguration _configuration;
public Test2Job(IConfiguration configuration)
{
_configuration = configuration;
}
public override string Cron => _configuration["Test2JobCron"];
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"{DateTime.Now}我是 Test2Job");
return Task.CompletedTask;
}
}
demo3
这个例子我们5分钟执行一次任务,并在任务中建立子任务。
[StartNow]
[TriggerCron("0 0/5 * * * ? ")]
public class Test3Job : IJob
{
private readonly IJobManager _jobManager;
public Test3Job(IJobManager jobManager)
{
_jobManager = jobManager;
}
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"{DateTime.Now}我是 Test3Job");
await _jobManager.AddJobAsync(typeof(Test4Job), CronCommon.SecondInterval(2), "111111");
}
}
[JobIgnore]
public class Test4Job : IJob
{
private readonly IJobManager _jobManager;
public Test4Job(IJobManager jobManager)
{
_jobManager = jobManager;
}
public Task Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.MergedJobDataMap;
string jobId = dataMap.GetString("JobId");
Console.WriteLine($"{DateTime.Now}Test4Job,参数{jobId}");
//await _jobManager.RemoveJobAsync(typeof(Test4Job), jobId);
return Task.CompletedTask;
}
}