Asp.net Core3.1集成Quartz做项目心跳(2)

先上图片

 

首先引用Quartz包,这个不用说了,我用的是3.3版本的

1.创建2个Job

[DisallowConcurrentExecution]//防止 运行多个相同的 任务实例
public class HelloWorldJob : IJob
{
private readonly ILogger<HelloWorldJob> _logger;
public HelloWorldJob(ILogger<HelloWorldJob> logger)
{
_logger = logger;
}

public Task Execute(IJobExecutionContext context)
{
_logger.LogInformation("Hello world!");
return Task.CompletedTask;
}

 

[DisallowConcurrentExecution]
public class IntroduceJob:IJob
{
private readonly ILogger<IntroduceJob> _logger;
public IntroduceJob(ILogger<IntroduceJob> logger)
{
_logger = logger;
}

public Task Execute(IJobExecutionContext context)
{
_logger.LogInformation("My name is chenhaonan");
return Task.CompletedTask;
}
}

 

2.创建一个JobSchedule类

public class JobSchedule
{
public JobSchedule(Type jobType, string cronExpression)
{
JobType = jobType;
CronExpression = cronExpression;
}

public Type JobType { get; }
public string CronExpression { get; }
}

 

3.创建一个QuartzHostedService类

public class QuartzHostedService: IHostedService
{
private readonly ISchedulerFactory _schedulerFactory;
private readonly IJobFactory _jobFactory;
private readonly IEnumerable<JobSchedule> _jobSchedules;

public QuartzHostedService(
ISchedulerFactory schedulerFactory,
IJobFactory jobFactory,
IEnumerable<JobSchedule> jobSchedules)
{
_schedulerFactory = schedulerFactory;
_jobSchedules = jobSchedules;
_jobFactory = jobFactory;
}

public IScheduler Scheduler { get; set; }

public async Task StartAsync(CancellationToken cancellationToken)
{
Scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
Scheduler.JobFactory = _jobFactory;

foreach (var jobSchedule in _jobSchedules)
{
var job = CreateJob(jobSchedule);
var trigger = CreateTrigger(jobSchedule);

await Scheduler.ScheduleJob(job, trigger, cancellationToken);
}

await Scheduler.Start(cancellationToken);
}

public async Task StopAsync(CancellationToken cancellationToken)
{
await Scheduler?.Shutdown(cancellationToken);
}

private static IJobDetail CreateJob(JobSchedule schedule)
{
var jobType = schedule.JobType;
return JobBuilder
.Create(jobType)
.WithIdentity(jobType.FullName)
.WithDescription(jobType.Name)
.Build();
}

private static ITrigger CreateTrigger(JobSchedule schedule)
{
return TriggerBuilder
.Create()
.WithIdentity($"{schedule.JobType.FullName}.trigger")
.WithCronSchedule(schedule.CronExpression)
.WithDescription(schedule.CronExpression)
.Build();
}
}

 

4.创建一个扩展类ServiceCollectionExtensions

public static class ServiceCollectionExtensions
{
public static void AddJob(this IServiceCollection services)
{
services.AddSingleton(new JobSchedule(
jobType: typeof(HelloWorldJob),
cronExpression: "0/10 * * * * ?")); // 10秒执行一次

services.AddSingleton(new JobSchedule(
jobType: typeof(IntroduceJob),
cronExpression: "0/5 * * * * ?"));//5秒执行一次

//这里可以加任意多(设备允许内)的Job去执行
//...
}
}

 

5.创建一个SingletonJobFactory类

public class SingletonJobFactory: IJobFactory
{
private readonly IServiceProvider _serviceProvider;
public SingletonJobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}

public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
}

public void ReturnJob(IJob job) { }
}

 

6.在startup中进行注册

在ConfigureServices方法中 添加如下:

// Add Quartz services
services.AddSingleton<IJobFactory, SingletonJobFactory>();
services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();

// Add our job
services.AddSingleton<HelloWorldJob>();
services.AddSingleton<IntroduceJob>();

services.AddJob();//扩展方法

services.AddHostedService<QuartzHostedService>();

 

7.就可以运行了,效果图

 

 

https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontrigger.html#examples    

posted on 2022-01-28 17:09  泰坦尼克号上的活龙虾  阅读(210)  评论(0)    收藏  举报

导航