Quarzt定时调度任务

简介

Quarzt是一个项目中定时执行任务的开源项目,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用,这里我们介绍和spring整合的例子

因为Spring已经整合Quarzt,所以我们只需要配置一下即可。

下载jar包

  1. 可以直接去http://www.quartz-scheduler.org/ Quarzt的官方网站下载jar包
  2. 可以通过Maven来构建,记得引入Spring所需要的jar
<!-- 引入quartz对应的依赖 -->     
<dependency>         
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz</artifactId>        
    <version>2.2.3</version>     
</dependency>     
<dependency>         
    <groupId>org.quartz-scheduler</groupId>         
    <artifactId>quartz-jobs</artifactId>         
    <version>2.2.3</version>     
</dependency>

概念

任务类:即需要定时执行代码的类。

JobDetail:配置任务类的细节,即注入任务类和指定任务类的方法,是一个可执行的工作,它本身可能是有状态的。

触发器(myTrigger):触发器代表一个调度参数的配置,配置调用的时间。

调度工厂(scheduler):是一个计划调度器容器,容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。

配置方法

  • 首先编写任务类
public class MyJob {
    public void job() {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ": 任务执行");
    }
}
  • 然后再spring配置任务类的bean
<bean id="myJob" class="quarzt.test.MyJob" / >
  • 配置JobDetail,注入任务类和任务类的方法
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!-- 注入目标对象 -->
    <property name="targetObject" ref="myJob"/>
    <!-- 注入目标方法 -->
    <property name="targetMethod" value="job"/>
</bean> 
  • 配置触发器
<!-- 配置触发器 -->
<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <!-- 注入任务详情对象 -->
    <property name="jobDetail" ref="jobDetail"/>
    <!-- 注入cron表达式,通过这个表达式指定触发的时间点 -->
    <property name="cronExpression">
        <value>/5 * * * * ?</value>    // 表示每隔五秒执行一次。  corn在下面会有活命
    </property> 
</bean>
  • 最后配置调度工厂并且注入配置好的触发器
<!-- 配置调度工厂 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <!-- 注入触发器 -->
    <property name="triggers">
        <list>
            <ref bean="myTrigger"/>
        </list>
    </property>
</bean> 

到此就配置完成,可以执行定时任务了。

执行结果

cron表达式

corn用来控制任务的调度时间,在Trigger中配置,下面是corn表达式的基本语法,如果看着太复杂,网上提供了corn语法生成器 http://cron.qqe2.com/ 可以通过指定条件自动生成corn表达式。

下面是七个*所代表的意义

星号:* 代表任意时间,即指示着你想在这个域上包含所有合法的值,

  • * * * * * *  代表每时每刻都会触发
  • 0 * 17 * * ?  : 每天从下午5点到下午5:59中的每分钟激发一次 trigger。它停在下午 5:59 是因为值 17 在小时域上,在下午 6 点时,小时变为 18 了,也就不再理会这个 trigger,直到下一天的下午5点。

问号(?):? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。

  • 0 10,44 14 ? 3 WEB :在三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。 

逗号(,) : 是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。 

  • 0 0,15,30,45 * * * ? :每刻钟触发一次 trigger。 

反斜线(/): (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样 0/15。 

  • 0/15 0/30 * * * ? :在整点和半点时每15秒触发 trigger。 

中划线(-):中划线 (-) 用于指定一个范围。例如,在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点。"  域的值不允许回卷,所以像 50-10 这样的值是不允许的。 

  • 0 45 3-8 ? * * ::在上午的3点至上午的8点的45分时触发。

字母(L):L 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天,当 L 字母用于周域上,指示着周的最后一天,就是星期六 (或者数字7),你可以用一个数字与 L 连起来表示月份的最后一个星期 X。

  • 0 0 8 L * ?:每个月最后一天的上午 8:00 触发
  • 0 59 23 ? * L:每个月的最后一个星期六下午的 11:59 触发
  • 0 0 12 ? * 2L:每个月的最后一个星期一触发(数字与 L 连起来表示月份的最后一个星期 X)

字母(W):平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日

井号(#):# 字符仅能用于周域中。它用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某月的第三个周五 (6=星期五,#3意味着月份中的第三周)。

示例

"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 ? 3WED" 每年三月的星期三的下午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 ? * 6L2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发

"0 15 10 ? *6#3" 每月的第三个星期五上午10:15触发

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

利用MapabcAPI实现基于浏览器的地理定位

现在互联网中有了越来越多的地理位置服务,正在制定中的HTML5规范也试图在浏览器中内置嵌入地理位置共享服务,而且幸运的是,我们已经能够在Firefox 3.5+...

864
来自专栏信安之路

密码破解那些事

最近恰巧刚好搞到一批hash,所以就寻思着,要不顺手小结一点关于hash破解的东西吧,反正经常要用,就当留备忘了,顺便也分享给大家,主要还是希望大家都能在实际渗...

830
来自专栏深度学习之tensorflow实战篇

Python信贷数据处理与初步分析(ZIP解压)

#!/usr/bin/python # coding=utf-8 ''' @author: lenovo @software: 3.6 PyChar...

3727
来自专栏tkokof 的技术,小趣及杂念

小议游戏控制台

  近来一直在搞iOS平台游戏,所用引擎则是cocos2dx,不少时间接触下来,感觉是愈来愈喜欢了:),虽然起初引擎稍显简陋,目前也仍然和商业引擎存在差距,但鉴...

531
来自专栏码匠的流水账

聊聊directory traversal attack

又称Path Traversal attack,即目录遍历攻击,旨在访问web服务器根目录外的文件/目录。通过是通过url或变量里头传递”../“来进行目录遍历...

861
来自专栏章鱼的慢慢技术路

当我阅读完上千行的游戏球球大作战战斗服务器端源码后...

这周服务器主程安排给了我一个任务(其实是我在用Go做完了一些小demo后,向主程请示下一步的安排),让我将他用Lua语言写的球球大作战的服务端代码转成Go语言形...

873
来自专栏FreeBuf

Flexera FlexNet Publisher中基于栈的缓冲区溢出漏洞分析

近日,安全人员在Flexera FlexNet Publisher(License Manager)中发现了一个基于栈的缓冲区溢出漏洞(CVE编号:CVE-20...

1857
来自专栏点滴积累

geotrellis使用(四十二)将 Shp 文件转为 GeoJson

原因很多,最重要的原因是我转行了。是的,我离开了开发岗位,走向了开发的天敌-产品经理。虽然名义上是产品经理,但是干的事情也很杂,除了不写代码,其他的都干,经常还...

882
来自专栏HansBug's Lab

1599: [Usaco2008 Oct]笨重的石子

1599: [Usaco2008 Oct]笨重的石子 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 795 ...

2585
来自专栏大数据挖掘DT机器学习

如何通过python爬虫来全自动抢微博红包?!

作者:admin IDF实验室 http://blog.idf.cn/2015/02/programming-of-grabing-red-envelop...

3465

扫码关注云+社区