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

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

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

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

  • someone

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

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

推荐标签 标签

  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 606 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖 • 1 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 41 关注
  • 域名

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

    43 引用 • 208 回帖 • 3 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 445 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    安卓端仓库:Hi-Windom/Sillot-android

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    28 引用 • 25 回帖 • 56 关注
  • 安全

    安全永远都不是一个小问题。

    191 引用 • 813 回帖
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖
  • 笔记

    好记性不如烂笔头。

    306 引用 • 782 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 10 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 355 关注
  • Facebook

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

    4 引用 • 15 回帖 • 455 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 96 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    109 引用 • 54 回帖 • 1 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 44 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 437 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 50 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 2 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    163 引用 • 473 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    16 引用 • 7 回帖 • 1 关注