Quartz.Net文档地址:https://www.quartz-scheduler.net/documentation/index.html
参考:http://www.cnblogs.com/mi12205599/p/10361763.html
Quartz.Net 任务监听:https://www.jianshu.com/p/ef1b6d1e11b2
本文源码地址:https://gitee.com/forestGzh/Gzh.Template.Core
实现效果:

在Startup中配置:(具体实现看源码)
在控制器中创建作业调度:(具体实现看源码)
namespace Gzh.Template.Core.WebApi.Controllers
{
[Route("api/[controller]")]
public class TestQuartzController : Controller
{
private readonly ISchedulerFactory _schedulerFactory;
private IScheduler _scheduler;
public TestQuartzController(ISchedulerFactory schedulerFactory)
{
_schedulerFactory = schedulerFactory;
_helloJobService = helloJobService;
}
/// <summary>
/// Tests the quartz.
/// </summary>
/// <returns>The quartz.</returns>
[HttpGet("testQuartz")]
public async Task<ActionResult> TestQuartz()
{
//1、通过调度工厂获得调度器
_scheduler = await _schedulerFactory.GetScheduler();
//2、开启调度器
await _scheduler.Start();
//3、创建一个触发器
var trigger = TriggerBuilder.Create()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
.Build();
//4、创建任务
var jobDetail = JobBuilder.Create<HelloJobTest>()
.WithIdentity("job", "group")
.Build();
//5、将触发器和任务器绑定到调度器中
await _scheduler.ScheduleJob(jobDetail, trigger);
return Ok();
}
}
}
添加、启动、删除作业调度:
作业调度实体类:(具体实现看源码)
using System;
using System.ComponentModel.DataAnnotations.Schema;
using Gzh.Template.Core.Repository.Core;
namespace Gzh.Template.Core.Repository.Domain.MysqlEntity
{
public class ScheduleEntity : EntityMysql
{
/// <summary>
/// Job的Key,在组内唯一
/// </summary>
/// <value>The job key.</value>
[Column("job_key")]
public string JobKey { get; set; }
/// <summary>
/// Job的组名
/// </summary>
/// <value>The job group.</value>
[Column("job_group")]
public string JobGroup { get; set; }
/// <summary>
/// trigger的Key,在组内唯一
/// </summary>
/// <value>The trigger key.</value>
[Column("trigger_key")]
public string TriggerKey { get; set; }
/// <summary>
/// trigger的组名
/// </summary>
/// <value>The trigger group.</value>
[Column("trigger_group")]
public string TriggerGroup { get; set; }
/// <summary>
/// 创建时间
/// </summary>
/// <value>The time create.</value>
[Column("time_create")]
public DateTime TimeCreate { get; set; }
/// <summary>
/// 开始执行时间
/// </summary>
/// <value>The time start.</value>
[Column("time_start")]
public DateTime TimeStart { get; set; }
/// <summary>
/// 结束时间
/// </summary>
/// <value>The time end.</value>
[Column("time_end")]
public DateTime TimeEnd { get; set; }
/// <summary>
/// 重复执行次数
/// </summary>
/// <value>The repet count.</value>
[Column("repeat_count")]
public int RepeatCount { get; set; }
/// <summary>
/// 运行状态
/// </summary>
/// <value>The state of the run.</value>
[Column("run_state")]
public string RunState { get; set; }
/// <summary>
/// 任务描述
/// </summary>
/// <value>The job description.</value>
[Column("job_description")]
public string JobDescription { get; set; }
}
}
对HelloJob这个作业的调度:(具体实现看源码)
using System;
using System.Threading.Tasks;
using Gzh.Template.Core.Repository.Domain.MysqlEntity;
namespace Gzh.Template.Core.Application.IService
{
public interface IHelloJobService
{
/// <summary>
/// 添加一个job
/// </summary>
/// <returns>The schedule job.</returns>
/// <param name="scheduleEntity">Schedule entity.</param>
Task<ScheduleEntity> AddScheduleJob(ScheduleEntity scheduleEntity);
/// <summary>
/// 运行一个job
/// </summary>
/// <returns><c>true</c>, if schedule job was run, <c>false</c> otherwise.</returns>
/// <param name="scheduleEntity">Schedule entity.</param>
Task<bool> RunScheduleJobAsync(ScheduleEntity scheduleEntity);
/// <summary>
/// 停止并删除一个job
/// </summary>
/// <returns><c>true</c>, if schedule job was stoped, <c>false</c> otherwise.</returns>
/// <param name="scheduleEntity">Schedule entity.</param>
Task<bool> RemoveScheduleJobAsync(ScheduleEntity scheduleEntity);
/// <summary>
/// 暂停一个job
/// </summary>
/// <returns><c>true</c>, if schedule was paused, <c>false</c> otherwise.</returns>
/// <param name="scheduleEntity">Schedule entity.</param>
Task<bool> PauseScheduleJobAsync(ScheduleEntity scheduleEntity);
}
}
HelloJob(实现job,trigger和scheduler的Listener):
https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html
https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/scheduler-listeners.html
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Quartz;
namespace Gzh.Template.Core.Application.Jobs
{
/// <summary>
/// quartz的作业类,在QuartzStartup中添加到调度程序中
/// </summary>
public class HelloJob : IJob, IJobListener, ITriggerListener, ISchedulerListener
{
private readonly ILogger _logger;
public string Name { get; }
public HelloJob(ILoggerFactory loggerFactory)
{
Name = this.GetType().ToString();
_logger = loggerFactory.CreateLogger<QuartzStartup>();
}
//实现IJob接口的Excute方法
public async Task Execute(IJobExecutionContext context)
{
//context.
_logger.LogInformation("job名称:" + context.JobDetail.Key
+ "\n trigger开始时间:" + context.Trigger.StartTimeUtc
+ "\n trigger结束时间:" + context.Trigger.EndTimeUtc
+ "\n 当前时间:" + DateTime.Now
+ "\n 当前触发时间:" + context.ScheduledFireTimeUtc
+ "\n 下次触发时间:" + context.NextFireTimeUtc
+ "\n 传递的数据:" + context.JobDetail.JobDataMap["name"]
);
//await Console.Out.WriteLineAsync("Hello Job" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
#region
public async Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken)
{
_logger.LogInformation("任务执行失败,重新执行");
//任务执行失败,再次执行任务
await Execute(context);
}
public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken)
{
_logger.LogInformation("准备执行任务");
//return null;
}
public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken)
{
_logger.LogInformation("任务执行完成");
}
#endregion
#region
public async Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken)
{
_logger.LogInformation("触发器触发成功 \n ------------------------------------------------------------------------------------------------------------------");
}
public async Task TriggerFired(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken)
{
_logger.LogInformation("触发器开始触发");
}
public async Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken)
{
_logger.LogInformation("触发器触发失败");
}
public async Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken)
{
_logger.LogInformation("可以阻止任务执行");
//true 阻止,false 不阻止
return false;
}
#endregion
#region
public async Task JobScheduled(ITrigger trigger, CancellationToken cancellationToken)
{
_logger.LogInformation("JobScheduled");
}
public async Task JobUnscheduled(TriggerKey triggerKey, CancellationToken cancellationToken)
{
_logger.LogInformation("JobUnscheduled");
}
public async Task TriggerFinalized(ITrigger trigger, CancellationToken cancellationToken)
{
_logger.LogInformation("TriggerFinalized");
}
public async Task TriggerPaused(TriggerKey triggerKey, CancellationToken cancellationToken)
{
_logger.LogInformation("TriggerPaused");
}
public async Task TriggersPaused(string triggerGroup, CancellationToken cancellationToken)
{
_logger.LogInformation("TriggersPaused");
}
public async Task TriggerResumed(TriggerKey triggerKey, CancellationToken cancellationToken)
{
_logger.LogInformation("TriggerResumed");
}
public async Task TriggersResumed(string triggerGroup, CancellationToken cancellationToken)
{
_logger.LogInformation("TriggersResumed");
}
public async Task JobAdded(IJobDetail jobDetail, CancellationToken cancellationToken)
{
_logger.LogInformation("JobAdded");
}
public async Task JobDeleted(JobKey jobKey, CancellationToken cancellationToken)
{
_logger.LogInformation("JobDeleted");
}
public async Task JobPaused(JobKey jobKey, CancellationToken cancellationToken)
{
_logger.LogInformation("JobPaused");
}
public async Task JobInterrupted(JobKey jobKey, CancellationToken cancellationToken)
{
_logger.LogInformation("JobInterrupted");
}
public async Task JobsPaused(string jobGroup, CancellationToken cancellationToken)
{
_logger.LogInformation("JobsPaused");
}
public async Task JobResumed(JobKey jobKey, CancellationToken cancellationToken)
{
_logger.LogInformation("JobResumed");
}
public async Task JobsResumed(string jobGroup, CancellationToken cancellationToken)
{
_logger.LogInformation("JobsResumed");
}
public async Task SchedulerError(string msg, SchedulerException cause, CancellationToken cancellationToken)
{
_logger.LogInformation("SchedulerError");
}
public async Task SchedulerInStandbyMode(CancellationToken cancellationToken)
{
_logger.LogInformation("SchedulerInStandbyMode");
}
public async Task SchedulerStarted(CancellationToken cancellationToken)
{
_logger.LogInformation("SchedulerStarted");
}
public async Task SchedulerStarting(CancellationToken cancellationToken)
{
_logger.LogInformation("SchedulerStarting");
}
public async Task SchedulerShutdown(CancellationToken cancellationToken)
{
_logger.LogInformation("SchedulerShutdown");
}
public async Task SchedulerShuttingdown(CancellationToken cancellationToken)
{
_logger.LogInformation("SchedulerShuttingdown");
}
public async Task SchedulingDataCleared(CancellationToken cancellationToken)
{
_logger.LogInformation("SchedulingDataCleared");
}
#endregion
}
}
网友评论