前言
通过昨天的努力终于算是了解Quartz这个定时器的简单使用,为了更深一步的了解和基于以后希望在项目中能使用他。所有我对他做了一下简单的封装操作,便于以后从新建立新工作和触发器,也方便写的代码不是那么的杂乱无章,所有就使用接口的方式进行了封装调用,算是个工厂模式的运用吧。哈哈。
接口类(IExample):
废话就不多说了,想要实现简单就要有个统一的访问接口,然后让所有的任务去实现统一接口,这样我们只需要调用统一接口就知道了任务所包含的所有方法,管理也方便管理,添加任务只需要实现接口方法就可以了。听起来很单简哪。因为我是实现简单的例子所有我就实现了启动任务,返回当前调度器,暂停,修改四个方法:
public interface IExample{/// <summary>/// 启动当前任务/// </summary>/// <returns></returns> Task Run();/// <summary>/// 返回当前调度器/// </summary>/// <returns></returns> IScheduler GetScheduler();/// <summary>/// 暂停当前任务/// </summary>void Shutdown();/// <summary>/// 修改当前任务时间触发/// </summary>void ModiyTime();}
任务的继承:
还记得上一篇文章中我们的SimpleExample类吗?下面我们就首先让他继承IExample接口类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
public class SimpleExample : BaseExample, IExample{#region 0.创建调度器public static ISchedulerFactory sf = new StdSchedulerFactory();public async Task<IScheduler> Ceart(){return await sf.GetScheduler();}#endregionpublic virtual async Task Run(){sched = await Ceart();//创建任务IJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("helloJob", "group1").Build();//创建触发器// DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow);//定义触发规则ITrigger trigger = TriggerBuilder.Create().WithIdentity("trgTest", "group1")// .StartAt(runTime).WithCronSchedule("0/5 * * * * ?") //5秒执行一次 .Build();//将任务与触发器添加到调度器中await sched.ScheduleJob(job, trigger);//启动任务await sched.Start();}}
然后我又创建了很多工作组,你说什么没有 返回当前调度器,暂停,修改三个方法,没想到还是被你发现了。
父类实现:
由于在项目实际中我们回创建很多的任务组,任务不一样,但是基础方法都是通用的所有我们创建父类实现方法的公用。这样我们只需要注重我们的任务方法就行了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
/// <summary>/// 扩展方法基类/// </summary>public class BaseExample{protected static IScheduler sched = null;#region 1.返回当前调度器/// <summary>/// 返回当前调度器/// </summary>/// <returns></returns>public IScheduler GetScheduler(){return sched;}#endregion#region 2.暂停当前任务/// <summary>/// 暂停当前任务/// </summary>public void Shutdown(){if (sched != null){sched.Shutdown();}}#endregion#region 3.修改当前任务触发时间public void ModiyTime(){ITrigger trigger = TriggerBuilder.Create().WithIdentity("trg1", "group1")// .StartAt(runTime).WithCronSchedule("0/10 * * * * ?") //10秒执行一次 .Build();sched.RescheduleJob(trigger.Key, trigger);sched.Start();}#endregion}
这里创建好了之后,只需要在没添加一个任务继承此类即可实现了该类的方法,是不是这样看起来就简单多了。
下面就是我的大致层次:
写在这里也是给我一点记忆帮助,也为了刚接触的小伙伴能快速理解一下。东西不是很多也不很深很好理解。