一、简介
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植。
可以用它来创建简单的或复制的调度,Quartz.NET主要包括:调度器Scheduler,任务IJobDetail,触发器ITrigger。
官方地址:Download Quartz.NET | Quartz.NET
二、使用方式简介
1.引用Quartz.dll。
第一次使用的2.5.0版本的,有多个定时执行任务,其中有一个不执行,后面都换用2.3.1版本。
2.定义定时任务。
例如自定义类MyJob需要实现IJob接口。在void Execute(IJobExecutionContext context)这个接口方法的实现中,调用业务逻辑。
另外在MyJob中为当前任务创建一个任务调度初始化并启动任务的方法,在调度器初始化时调用,例如代码如下
public class MyJob : IJob
{
/// <summary>
/// 任务名称
/// </summary>
public static string JobName { get { return "MyJob"; } }
/// <summary>
/// 任务触发器名称
/// </summary>
public static string JobTriggerName { get { return "MyJobTrigger"; } }
/// <summary>
/// 触发时间表达式
/// </summary>
public static string CronExpression { get { return JobConfig.CronExpression(JobName); } }
/// <summary>
/// IJob接口实现
/// </summary>
/// <param name="context"></param>
public void Execute(IJobExecutionContext context)
{
try
{
MyJobBuisiness bll = new MyJobBuisiness();
bll.Backup();
}
catch (Exception ex)
{
//记录Job运行日志
LogText.OprLog("备份执行异常,异常原因:" + ex.Message);
}
}
/// <summary>
/// 任务配置初始化并调用
/// </summary>
public static void Execute(IScheduler scheduler)
{
try
{
//初始化任务
IJobDetail job = JobBuilder.Create<MyJob>().WithIdentity(JobName).Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(JobTriggerName)
.ForJob(JobName)
.WithSchedule(CronScheduleBuilder.CronSchedule(CronExpression))
.Build();
//开始启动任务
scheduler.ScheduleJob(job, trigger);
}
catch (Exception ex)
{
//启动备份任务失败
throw ex;
//记录任务调度异常日志
}
}
}
3.任务配置
本例使用Xml文档来配置任务调度时间表达式,当然你也可以使用其他方式配置时间表达式。也可以在任务初始化时,直接设置任务执行时间或间隔。
<?xml version="1.0" encoding="utf-8" ?>
<Jobs>
<!--节点属性说明 IsEnabled(0:未启用,1:启用) CronExpression:任务触发器时间配置表达式 -->
<BackupJob IsEnabled="1" CronExpression="0 25 14 * * ?">备份任务</BoxCodeBackupJob>
</Jobs>
4.任务调度
对任务调度的管理,
public class JobManager
{
private ISchedulerFactory schedulerFactory;
private IScheduler scheduler;
/// <summary>
/// 初始化
/// </summary>
public JobManager()
{
schedulerFactory = new StdSchedulerFactory();
scheduler = schedulerFactory.GetScheduler();
}
/// <summary>
/// 运行所有任务
/// </summary>
/// <param name="scheduler"></param>
private void ExecuteJobs(IScheduler scheduler)
{
new MyJob().Execute(scheduler);
new MyJob2().Execute(scheduler);
}
#region 启动
/// <summary>
/// Job调度程序开始
/// </summary>
public void Start()
{
try
{
scheduler.Start();
ExecuteJobs(scheduler);
}
catch (Exception ex)
{
LogText.OprLog("Job调度程序启动错误:"+ ex.Message);
//throw ex;
}
}
#endregion
#region 终止
/// <summary>
/// Job调度程序停止[强行停止]
/// </summary>
public void Stop()
{
try
{
if (scheduler != null) scheduler.Shutdown();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// Job调度程序停止[等当前运行的Job完成再停止]
/// </summary>
/// <param name="isWaitForJobsToComplete"></param>
public void Stop(bool isWaitForJobsToComplete)
{
try
{
if (scheduler != null) scheduler.Shutdown(isWaitForJobsToComplete);
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 暂停
/// <summary>
/// Job调度程序暂停
/// </summary>
public void Pause()
{
try
{
scheduler.PauseAll();
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 恢复
/// <summary>
/// Job调度程序由挂起状态恢复
/// </summary>
public void Resume()
{
try
{
scheduler.ResumeAll();
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
}