Quartz(任务调度框架)练习(2)
1:首先创建一个WebAPi
代码地址:Quartz代码
2:安装Quartz
3:创建文件夹和文件
4:复制代码
复制以后 看代码注释解释
JobFactory:
///
/// 工作工厂
///
public class JobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
///
/// 构造注入
///
///
public JobFactory(IServiceProvider serviceProvider) => _serviceProvider = serviceProvider;
///
/// 创建一个指定类型的job
///
///
///
///
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
// 获得一个ioc对象,指定创建scope级别的实例
// 不写的话,默认是单例。
var serviceScope = _serviceProvider.CreateScope();
// 依赖注入一个 job 然后返回
return serviceScope.ServiceProvider.GetService(bundle.JobDetail.JobType) as IJob;
}
public void ReturnJob(IJob job)
{
}
JobSchedule:
///
/// 任务计划表
///
public class JobSchedule
{
public JobSchedule(Type jobType, string cronExpression)
{
JobType = jobType;
CronExpression = cronExpression;
}
///
/// 作业类型
///
public Type JobType { get; }
///
/// cron 表达式
///
public string CronExpression { get; }
}
QuartzHostedService:
///
/// quartz 主机服务
///
[DisallowConcurrentExecution]
public class QuartzHostedService : IHostedService //IHostedService 主机中注册托管服务
{
///
/// 定时作业计划生成工厂
///
private readonly ISchedulerFactory _schedulerFactory;
///
/// 定时作业工厂
///
private readonly IJobFactory _jobFactory;
///
/// 定时作业计划集合,配合dotnet core的ioc注入进来
///
private readonly IEnumerable _jobSchedules;
///
/// 日志
///
private readonly ILogger _logger;
///
/// quartz 调度器
///
private IScheduler _scheduler;
///
/// 构造注入
///
///
///
///
///
public QuartzHostedService(ISchedulerFactory schedulerFactory, IJobFactory jobFactory, IEnumerable jobSchedules, ILogger logger)
{
_schedulerFactory = schedulerFactory;
_jobFactory = jobFactory;
_jobSchedules = jobSchedules;
_logger = logger;
}
///
/// 批量启动定时任务
///
///
///
public async Task StartAsync(CancellationToken cancellationToken)
{
_scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
_scheduler.JobFactory = _jobFactory;
// 判断有没有记录,有的话,quartz会自动提取信息创建 schedule
foreach (var jobs in _jobSchedules)
{
var a = await _scheduler.CheckExists(new JobKey(GenerateIdentity(jobs, IdentityType.Job)));
var b = await _scheduler.CheckExists(new TriggerKey(GenerateIdentity(jobs, IdentityType.Trigger)));
if (!a && !b)
{
//创建定时作业
var job = CreateJob(jobs);
//创建触发器
var trigger = CreateTrigger(jobs);
await _scheduler.ScheduleJob(job, trigger, cancellationToken);
}
}
await _scheduler.Start();
}
///
/// 创建触发器
///
///
///
private static ITrigger CreateTrigger(JobSchedule schedule)
{
return TriggerBuilder
.Create()
.WithIdentity(GenerateIdentity(schedule, IdentityType.Trigger))
.WithCronSchedule(schedule.CronExpression)
.WithDescription(schedule.JobType.FullName)
.Build();
}
///
/// 创建定时作业
///
///
///
private static IJobDetail CreateJob(JobSchedule schedule)
{
return JobBuilder.Create(schedule.JobType).WithIdentity(GenerateIdentity(schedule, IdentityType.Job)).WithDescription(schedule.CronExpression).Build();
}
///
/// 停止
///
///
///
public Task StopAsync(CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
///
/// 生成一个标识
///
///
/// 标识类型,一个job作业,或者是trigger触发器
///
private static string GenerateIdentity(JobSchedule schedule, IdentityType identityType)
{
switch (identityType)
{
case IdentityType.Job:
return $"NdcPayInternal_Job_{schedule.JobType.Name}";
case IdentityType.Trigger:
return $"NdcPayInternal_Trigger_{schedule.JobType.Name}";
}
return schedule.JobType.FullName;
}
///
/// 标识类型
///
private enum IdentityType
{
Job,
Trigger
}
}
Program:
//任务计划
//-------------------------------------
builder.Services.AddHostedService();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
//-------------------------------------
MyJob1:
public class MyJob1 : IJob
{
///
/// 日志
///
private readonly ILogger _logger;
///
/// 日志引擎 ILogger
///
///
public MyJob1(ILogger logger)
=> _logger = logger;
public Task Execute(IJobExecutionContext context)
{
_logger.LogInformation(DateTime.Now.ToString() + " 执行了我,我是 【job1】");
return Task.CompletedTask;
}
}
MyJob2:
///
/// 工作日志
///
public class MyJob2 : IJob
{
private readonly ILogger logger;
public MyJob2(ILogger _logger) => logger = _logger;
public Task Execute(IJobExecutionContext context)
{
//设置信息日志消息格式并写入该消息。
logger.LogInformation(DateTime.Now.ToString() + " 执行了我,我是 【job2】");
return Task.CompletedTask;
}
}
Program:
// 请求获取-(GC回收-主动释放) 每一次获取的对象都不是同一个
builder.Services.AddTransient();
builder.Services.AddTransient(u => new JobSchedule(jobType: typeof(MyJob1), cronExpression: "0/10 * * * * ?"));
builder.Services.AddTransient();
builder.Services.AddTransient(u => new JobSchedule(jobType: typeof(MyJob2), cronExpression: "0/15 * * * * ?"));
//-------------------------------------