这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作。由于没有用过Quartz是一个任务调度,一直使用这个办法,今天通过同事提点,从此改变这种笨模式。
1.基础知识
Quartz任务调度的核心元素为:Scheduler——任务调度器、Trigger——触发器、Job——任务。其中trigger和job是任务调度的元数据,scheduler是实际执行调度的控制器。Trigger是用于定义调度时间的元素,即按照什么时间规则去执行任务。Quartz中主要提供了四种类型的trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和NthIncludedDayTrigger。这四种trigger可以满足企业应用中的绝大部分需求。
2.一直用的时间判断方法
var nDateTime = DateTime.Now; var sDateTime = DateTime.Parse("08:00:00"); var eDateTime = DateTime.Parse("20:00:00"); if (sDateTime <= nDateTime && nDateTime <= eDateTime) { //Operation1 } else { //Operation2 }
3. 开始进入正题(Quartz时间调度)
1.引用Quartz相关的dll组件(组件百度上自行下载)
2.我在项目中封装了一个帮助类,便于调用
public class TestJob
{
private static IScheduler scheduler = null;
public class OperateJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//定时需要操作的语句写在这就ok
}
}
/// <summary>
/// 初始化定时器
/// </summary>
/// <param name="type">0:每天,1:每周</param>
/// <param name="weekday">星期几</param>
/// <param name="hour">小时</param>
/// <param name="minute">分钟</param>
public static bool InitOperateTimer(int type, string weekday, int hour, int minute)
{
try
{
release(); //释放定时器
ISchedulerFactory factory = new StdSchedulerFactory(); //工厂
if (scheduler == null)//启动
scheduler = factory.GetScheduler();
scheduler.Start(); //启动
IJobDetail job = JobBuilder.Create<OperateJob>().WithIdentity("Ipjob", "Ipjobs").Build(); //描述工作
ITrigger trigger = null; //触发器
trigger = TriggerBuilder.Create().StartAt(DateTime.Now.AddSeconds(0)).WithCronSchedule("30 3 12 * * ? ").Build();//时间 12:03:30 触发Execute()
//执行
scheduler.ScheduleJob(job, trigger);
}
catch (Exception ex)
{
return false;
}
return true;
}
/// <summary>
/// 释放
/// </summary>
public static void release()
{
if (scheduler != null && !scheduler.IsShutdown)
{
scheduler.Shutdown(true);
scheduler = null;
}
}
}
trigger = TriggerBuilder.Create().StartAt(DateTime.Now.AddSeconds(0)).WithCronSchedule("30 3 12 * * ? ").Build();//时间 12:03:30 触发Execute()
就可以在这里设置你需要执行的时间。QuartZ Corn表达式在这里罗列一下,也可以自行搜索。
4.QuartZ Corn表达式
Cron Expressions
cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。
* * * * * * *
Seconds Minutes Hours Day-of-Month Month Day-of-Week Year (可选字段)
1.Seconds (0~59)
2.Minutes (0~59)
3.Hours (0~23)
4.Day-of-Month (1~31,但是要注意有些月份没有31天)
5.Month (0~11,或者"JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,DEC")
6.Day-of-Week (1~7,1=SUN 或者"SUN, MON, TUE, WED, THU, FRI, SAT”)
7.Year (1970~2099)
1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
“*” 代表整个时间段
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
2)Cron表达式范例:(网上的例子,我直接拿过来了)
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?