这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作。由于没有用过Quartz是一个任务调度,一直使用这个办法,今天通过同事提点,从此改变这种笨模式。

1.基础知识

     Quartz任务调度的核心元素为:Scheduler——任务调度器、Trigger——触发器、Job——任务。其中trigger和job是任务调度的元数据,scheduler是实际执行调度的控制器。Trigger是用于定义调度时间的元素,即按照什么时间规则去执行任务。Quartz中主要提供了四种类型的trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和NthIncludedDayTrigger。这四种trigger可以满足企业应用中的绝大部分需求。

2.一直用的时间判断方法

  1. var nDateTime = DateTime.Now;
  2. var sDateTime = DateTime.Parse("08:00:00");
  3. var eDateTime = DateTime.Parse("20:00:00");
  4. if (sDateTime <= nDateTime && nDateTime <= eDateTime)
  5. {
  6. //Operation1
  7. }
  8. else
  9. {
  10. //Operation2
  11. }

3. 开始进入正题(Quartz时间调度)

1.引用Quartz相关的dll组件(组件百度上自行下载)

2.我在项目中封装了一个帮助类,便于调用

  1. public class TestJob
  2. {
  3. private static IScheduler scheduler = null;
  4. public class OperateJob : IJob
  5. {
  6. public void Execute(IJobExecutionContext context)
  7. {
  8. //定时需要操作的语句写在这就ok
  9. }
  10. }
  11.  
  12. /// <summary>
  13. /// 初始化定时器
  14. /// </summary>
  15. /// <param name="type">0:每天,1:每周</param>
  16. /// <param name="weekday">星期几</param>
  17. /// <param name="hour">小时</param>
  18. /// <param name="minute">分钟</param>
  19. public static bool InitOperateTimer(int type, string weekday, int hour, int minute)
  20. {
  21. try
  22. {
  23.  
  24. release(); //释放定时器
  25. ISchedulerFactory factory = new StdSchedulerFactory(); //工厂
  26.  
  27. if (scheduler == null)//启动
  28. scheduler = factory.GetScheduler();
  29.  
  30. scheduler.Start(); //启动
  31. IJobDetail job = JobBuilder.Create<OperateJob>().WithIdentity("Ipjob", "Ipjobs").Build(); //描述工作
  32. ITrigger trigger = null; //触发器
  33. trigger = TriggerBuilder.Create().StartAt(DateTime.Now.AddSeconds()).WithCronSchedule("30 3 12 * * ? ").Build();//时间 12:03:30 触发Execute()
  34.  
  35. //执行
  36. scheduler.ScheduleJob(job, trigger);
  37. }
  38. catch (Exception ex)
  39. {
  40. return false;
  41. }
  42. return true;
  43. }
  44. /// <summary>
  45. /// 释放
  46. /// </summary>
  47. public static void release()
  48. {
  49. if (scheduler != null && !scheduler.IsShutdown)
  50. {
  51. scheduler.Shutdown(true);
  52. scheduler = null;
  53. }
  54. }
  55. }

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. mybatis缓存(一,二级别)

    数据查找过程: 二级缓存(默认关闭) -> 一级缓存(默认开启) -> 数据库 一级缓存: 一级缓存是SqlSession自带的.SqlSession对象被创建,一级缓存就存在了.//是针 ...

  2. python之常用模块篇5

    一.日志模块,logging模块 1)logging模块简单使用,屏幕输出.默认级别30 import logging logging.debug( logging.info( logging.war ...

  3. 2018.12.08 codeforces 939E. Maximize!(二分答案)

    传送门 二分答案好题. 题意简述:要求支持动态在一个数列队尾加入一个新的数(保证数列单增),查询所有子数列的 最大值减平均值 的最大值. 然而网上一堆高人是用三分做的. 我们先考虑当前的答案有可能由什 ...

  4. 2018.11.02 NOIP模拟 优美的序列(数论+单调栈/链表)

    传送门 考虑如果一个区间满足最小值等于最大公约数那么这个区间是合法的. 因此我们对于每一个点维护可以延展到的最左/右端点保证这一段区间的gcdgcdgcd等于这个点的值. 这个可以用之前同类的链表或者 ...

  5. 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)

    传送门 一道挺妙的题. 对于询问点(u,v),如右图所示,我们可以发现存在一个点m在u->v的路径中,m子树的点到u是最近的,m子树外到v是最近的.其中dis(u,m)=(dis(u,v)-1) ...

  6. IntelliJ IDEA 2017版 spring-boot搭建拦截器

    1.建立一个springboot-web项目 https://www.cnblogs.com/liuyangfirst/p/8298588.html 2.加入过滤接口 public class Log ...

  7. 二级缓存EhCache在几种应用技术的配置方法和步骤总结

    一:Spring和Ehcache缓存集成 业务问题:如果仓库不经常变动,大量进出库,总是需要查询仓库列表 (列表重复) ,使用缓存优化 ! 阅读spring规范29章节 第一步: 导入ehcache的 ...

  8. vue2.0路由-路由嵌套

    vue一个重要的方面就是路由,下面是自己写的一个路由的例子: 1.引入依赖库就不必再说 2.创建组件 两种写法 第一种:间接 <template id="home"> ...

  9. 【慕课网实战】Spark Streaming实时流处理项目实战笔记五之铭文升级版

    铭文一级: 单节点单broker的部署及使用 $KAFKA_HOME/config/server.propertiesbroker.id=0listenershost.namelog.dirszook ...

  10. Python 安装requests和MySQLdb

    Python 安装requests和MySQLdb 2017年10月02日 0.系统版本 0.1 查看系统版本 [root@localhost ~]# uname -a Linux localhost ...