java时间调度之SpringQuartz调度框架使用

本贴最后更新于 3107 天前,其中的信息可能已经时移世异

Quartz 是一个开源的作业调度框架,设计用于 J2SE  J2EE 应用中。提供了巨大的灵活性而不牺牲简单性。能够用它来为执行一个作业而创建简单的或复杂的调度

Spring Quartz 是基于 Quartz 做的2次封装

Quartz分为2种调度器,简单调度和任务调度 ,核心就是3个bean

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean -- 定制任务类

org.springframework.scheduling.quartz.SimpleTriggerBean -- 简单触发器

org.springframework.scheduling.quartz.CronTriggerBean -- 任务触发器

org.springframework.scheduling.quartz.SchedulerFactoryBean --调度工厂

一、调度的步骤

1、制定任务信息 bean
  设置执行对象
  设置执行对象中对应的执行方法
  是否可以同步执行

2、制定任务执行时机(执行触发器) bean
  2.1、简单触发器或任务调度器(SimpleTrigger,CronTriggerBean
    设置任务详细(二者都需要)
    设置任务延迟执行时间(任务调度器不需要配置)
    设置任务执行频率(任务调度器不需要配置)
    设置任务执行时机,cron表达式(任务调度器必须用)

2.2、任务触发器(CronTrigger)
  设置任务详细
  设置执行时机(cronExpression)
  cronExpression:秒 分 时 日 月 周 年(可选)

3、设置任务调度工厂 bean
  设置触发器们(可能是一个或多个触发器)

二、调度器demo

1、简单触发器

第一步先定义一个普通类,新增需要执行的方法

import java.text.SimpleDateFormat;
import java.util.Date;
//简单触发器、打印出来当前时间
public class QuartzTask {
public void doSimpleTriggerTask() {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  System.out.println("doing simpleTrigger task..." +    sdf.format(new Date()));
  }	
}

第二步编写spring配置文件

<!-- 注册一个普通bean -->
<bean id="quartzTask" class="cn.terry.nsfw.complain.QuartzTask"></bean>
<!-- 1、制定任务信息信息 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!-- 设置执行对象 -->
    <property name="targetObject" ref="quartzTask"></property>
    <!-- 设置执行对象中对应的执行方法 -->
    <property name="targetMethod" value="doSimpleTriggerTask"></property>
    <!-- 是否可以同步执行;不可同步执行 -->
    <property name="concurrent" value="false"></property>
</bean>
<!-- 2、制定任务执行时机(执行简单触发器) -->
<bean id="simplerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <!-- 设置任务详细 -->
    <property name="jobDetail" ref="jobDetail1"></property>
    <!-- 设置任务延迟执行时间 ;延迟2秒执行-->
    <property name="startDelay" value="2000"></property>
    <!-- 设置任务执行频率;执行频率为每2秒执行一下 -->
    <property name="repeatInterval" value="2000"></property>
</bean>
<!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="simplerTrigger"/>
        </list>
    </property>
</bean>

至此启动spring 2秒以后就会每2秒自动输出当前的时间

2、任务触发器

第一步先定义普通类,新增需要执行的方法

import java.text.SimpleDateFormat;
import java.util.Date;
//任务触发器、打印出来当前时间
public class QuartzTask {
  public void doCronTriggerTask() {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("doing cronTrigger task..." + sdf.format(new Date()));
  }
}

第二步编写spring配置文件

<!-- 注册一个普通bean -->
<bean id="quartzTask" class="cn.terry.nsfw.complain.QuartzTask"></bean>
    <!-- 1、制定任务信息信息 -->
    <bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!-- 设置执行对象 -->
    <property name="targetObject" ref="quartzTask"></property>
    <!-- 设置执行对象中对应的执行方法 -->
    <property name="targetMethod" value="doCronTriggerTask"></property>
    <!-- 是否可以同步执行;不可同步执行 -->
    <property name="concurrent" value="false"></property>
</bean>
<!-- 2、制定任务执行时机(任务执行触发器) -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <!-- 设置任务详细 -->
    <property name="jobDetail" ref="jobDetail2"></property>
    <!-- 设置任务执行时机,cron表达式 -->
    <property name="cronExpression" value="* * * 18c * ?"></property>
</bean>
<!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger"/>
        </list>
    </property>
</bean>

至此启动spring 2秒以后就会每2秒自动输出当前的时间

Tips:任务触发器常用,简单触发器没啥用

 

关于cronExpression表达式,这里简单说一下: 

字段 允许值 允许的特殊字符 
秒 0-59 , - * / 
分 0-59 , - * / 
小时 0-23 , - * / 
日期 1-31 , - * ? / L W C 
月份 1-12 或者 JAN-DEC , - * / 
星期 1-7 或者 SUN-SAT , - * ? / L C # 
年(可选) 留空, 1970-2099 , - * / 
表达式意义 
"0 0 12 * * ?" 每天中午12点触发 
"0 15 10 ? * *" 每天上午10:15触发 
"0 15 10 * * ?" 每天上午10:15触发 
"0 15 10 * * ? *" 每天上午10:15触发 
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
"0 15 10 15 * ?" 每月15日上午10:15触发 
"0 15 10 L * ?" 每月最后一日的上午10:15触发 
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 
每天早上6点 
0 6 * * * 
每两个小时 
0 */2 * * * 
晚上11点到早上8点之间每两个小时,早上八点 
0 23-7/2,8 * * * 
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 
0 11 4 * 1-3 
1月1日早上4点 
0 4 1 1 *
 

 

 

 

 

 

 

 

 

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 714593351

    其实我想看,怎么控制任务的执行、暂停、动态添加任务等等。。。

  • 其他回帖
  • someone

    详细请看 这个 http://blog.csdn.net/pengpegv5yaya/article/details/37595889
    核心原理是 spring 接管 quartz

  • someone

    spring quartz 都要写在配置文件中的 ,一般公司的做法都是 多态 java 容器做集群,然后 只需要修改一台的,跟着推送到其余服务器,然后半夜分批短重启服务器,不管是 执行 暂停 还是动态添加 都需要写入到配置文件,而项目上线以后,配置文件 修改必然要重启应用,启动以后 才能生效。所以 动态 这一概念不存在

terry
再牛逼的事情也经不住傻逼一样的坚持 北京

推荐标签 标签

  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 48 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    397 引用 • 3418 回帖 • 1 关注
  • abitmean

    有点意思就行了

    24 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 2 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 463 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 22 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    20 引用 • 74 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖 • 2 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 179 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 454 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 547 关注
  • 自由行
    3 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 125 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    3 引用 • 83 回帖 • 2 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    478 引用 • 902 回帖 • 1 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 692 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 509 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 687 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 3 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 693 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 353 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注