这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作。由于没有用过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()).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 * * ?

Quartz是一个任务调度的更多相关文章

  1. 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子

    1. 一个简单的Quartz 工程     本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...

  2. 基于 Quartz 开发企业级任务调度应用

    原文地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/index.html Quartz 基本概念及原理 Quartz S ...

  3. 基于 Quartz 开发企业级任务调度应用--转

    Quartz 基本概念及原理 Quartz Scheduler 开源框架 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.该项目于 2009 ...

  4. Quartz.NET 的任务调度管理工具

    [更新] 基于Quartz.NET 的任务调度管理工具   更新列表: 任务参数可视化. 立即中断正在执行的任务. 每个任务独立的应用程序域 上一版参见: 基于Quqrtz.NET 做的任务调度管理工 ...

  5. 项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度

    前言 系列文章:[传送门] 项目需求: http://www.cnblogs.com/Alandre/p/3733249.html 上一博客写的是基本调度,后来这只能用于,像每天定个时间 进行数据库备 ...

  6. quartz (一) 基于 Quartz 开发企业级任务调度应用

    本文转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/ Quartz 基本概念及原理 Quartz Scheduler 开 ...

  7. quartz的一个误导

    quartz文档提到,如果在集群环境下,最好将配置项org.quartz.jobStore.txIsolationLevelSerializable设置为true 问题: 这个选项在mysql下会非常 ...

  8. 【Quartz】一个小Demo

    Quartz是一个优秀的框架,功能强大,用法简单,比如说下面这个例子. (1)引入Jar包 <!-- quartz 模块 --> <dependency> <groupI ...

  9. Hosted Services+Quartz实现定时任务调度

    背景 之前.net core使用quartz.net时,总感觉非常变扭,百度和谷歌了N久都没解决以下问题,造成代码丑陋,非常不优雅: 1.项目启动时,要立刻恢复执行quartz.net中的任务 2.q ...

随机推荐

  1. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  2. TFS SDK

    vs2013 已包含. 可参考 TFS SDK: Connecting to TFS 2010 & TFS 2012 Programmatically http://geekswithblog ...

  3. Unity2017新功能Sprite Atlas详解

    Sprite Atlas(精灵图集)Sprite Atlas 针对现有的图集打包系统Sprite Packer在性能和易用性上的不足,进行了全面改善.除此之外,相比Sprite Packer,Spri ...

  4. 45.UITableView去除分割线

    1.去除所有的分割线 table.separatorStyle = UITableViewCellSelectionStyleNone; 2.去除指定某一行的分割线 cell.separatorIns ...

  5. Fiddler建好代理后,能连到手机,但手机不能上网了是什么原因

    依次 tools(工具) >>   fiddler options(fiddler选项)   >>   connections( 连接) >>allow remot ...

  6. 2018.11.03 NOIP模拟 地球发动机(线性dp)

    传送门 考试5分钟写完. 如果没这题今天多半爆零了(汗 直接二分出合法的转移范围. 然后用后面的状态更新前面的就可以了. 代码

  7. 2018.10.31 NOIP模拟 几串字符(数位dp+组合数学)

    传送门 如果观察到性质其实也不是很难想. 然而考试的时候慌得一批只有心思写暴力233. 下面是几个很有用的性质: c0,1+1≥c1,0≥c0,1c_{0,1 }+1 ≥ c_{1,0} ≥ c_{0 ...

  8. CHAPITRE III

    Il me fallut longtemps pour comprendre d'où il venait. Le petit prince, qui me posait beaucoup de qu ...

  9. 查询正在执行的SQL语句DBCCINPUTBUFFER

    DBCC INPUTBUFFER 返回进程下SQL语句 如果查询所有的进程如何呢? 创建一个存储过程 CREATE proc pr_dbccINPUTBUFFER(@spid varchar(200) ...

  10. HDMI中checksum计算法

    在AVI传输过程中有三个字节没有被传输.这是在HDMI1.4B中找到的前三个字节的数据. >> hex2dec('82') ans = 130 下图中的数据中在HDMI中接收到的一串数据, ...