spring4定时器 cronTrigger和simpleTrigger实现方法

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

SimpleTrigger  当需要在规定的时间执行一次或在规定的时间段以一定的时间间隔重复触发执行Job时,SimpleTrigger就可以满足要求;SimpleTrigger的属性有:开始时间、结束时间、重复次数和重复的时间间隔,重复次数属性的值可以为0、正整数、或常量 SimpleTrigger.REPEAT_INDEFINITELY,重复的时间间隔属性值必须为0或长整型的正整数,以毫秒作为时间单位,当重复的时 间间隔为0时,意味着与Trigger同时触发执行(或几乎与Scheduler开始时同时触发执行)。如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于:当我们需要创建一个每间隔10秒钟触发一次直到指定的结束时间的 Trigger,而无需去计算从开始到结束的所重复的次数,我们只需简单的指定结束时间和使用REPEAT_INDEFINITELY作为重复次数的属性 值即可(我们也可以指定一个比在指定结束时间到达时实际执行次数大的重复次数)。

     CronTrigger  支持比 SimpleTrigger 更具体的调度,而且也不是很复杂。基于 cron 表达式,CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔。

Cron 表达式包括以下 7 个字段

格式: [秒] [分] [小时] [日] [月] [周] [年]
序号     说明       是否必填      允许填写的值       允许的通配符
 1           秒               是                  0-59                   , - * /
 2           分               是                  0-59                   , - * /
 3          小时            是                  0-23                    , - * /
 4          日               是                  1-31                     , - * ? / L W
 5          月               是           1-12 or JAN-DEC        , - * /
 6          周              是            1-7 or SUN-SAT          , - * ? / L #
 7          年               否         empty 或 1970-2099      , - * /

Quartz官方网站对SimpleTrigger和CronTrigger的简单对比: 
     SimpleTrigger is handy if you need 'one-shot' execution (just single execution of a job at a given moment in time), or if you need to fire a job at a given time, and have it repeat N times, with a delay of T between executions.当你需要的是一次性的调度(仅是安排单独的任务在指定的时间及时执行),或者你需要在指定的时间激活某个任务并执行N次,设置每次任务执行的间隔时间T。那此时使用SimpleTrigger将是非常方便的。

    CronTrigger is useful if you wish to have triggering based on calendar-like schedules - such as "every Friday, at noon" or "at 10:15 on the 10th day of every month."如果你需要安排的任务时基于日期的-比如"每个星期五正午"或者"每个月10号的10:15",使用CronTrigger将是非常有用的。

1、配置applicationcontext.xml

<!-- cronTrigger实现方式 -->
<bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean"><property name="jobClass" value="com.ouku.entities.report.ReportTimerTask" /><property name="jobDataAsMap"><map><entry key="timeout" value="3600" /></map></property></bean><bean id="springUtil" class="com.ouku.util.SpringUtil" /><bean id="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="exampleJob" /><!-- run every morning at 6 AM --><!-- <property name="cronExpression" value="0 0 6 * * ?" /> --><!-- <property name="cronExpression" value="0 0/1 * * * ?" /> --><!-- 每分钟 --><property name="cronExpression" value="0/5 * * * * ?" /> <!-- 每秒 --></bean><bean id="exampleBusinessObject" class="com.ouku.entities.report.ReportTimerTaskTwo" /><bean id="jobDetail"
<!-- simpleTrigger实现方式 -->
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="exampleBusinessObject" /><property name="targetMethod" value="doIt" /><property name="concurrent" value="false" /></bean><bean id="simpleTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"><!-- see the example of method invoking job above --><property name="jobDetail" ref="jobDetail" /><!-- 0 seconds --><property name="startDelay" value="0" /><!-- repeat every 5 seconds --><property name="repeatInterval" value="5000" /></bean><!-- 总调度用于启动Spring定时器 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger" /><ref bean="simpleTrigger"/></list></property></bean>

其中<property name="concurrent" value="false" />

  1. 设置为false时,定时任务会串行执行;就是定时任务开启时,知道这个job结束,才会执行下一个定时任务;
  2. 设置为true时,定时任务会并发执行,就是不管这个job有没有执行完,定时任务都会启动,如果没有执行完,定时任务会开一个新的线程来执行job,确保能在设定的时间间隔内执行job;定时器默认最多有十个线程,当十个线程都用完时,定时任务会阻塞,直到有新的线程可用,才会开启定时任务去执行job;

2.利用cronTrigger的Java实现

package com.ouku.entities.report;import java.util.Date;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.ouku.report.ReportTask;public class ReportTimerTask extends QuartzJobBean  {private int timeout;public void setTimeout(int timeout) {this.timeout = timeout;}@Overrideprotected void executeInternal(JobExecutionContext arg0)throws JobExecutionException {try {Date date = new Date();String dd = " " + date.getMinutes() + ":" + date.getSeconds() + " ";System.out.println("AAA" + dd);//to do} catch (Exception e) {e.printStackTrace();}}}

3.利用simpleTrigger的Java实现

package com.ouku.entities.report;import java.util.Date;import org.quartz.JobExecutionException;
import com.ouku.report.ReportTask;public class ReportTimerTaskTwo {public void doIt() throws JobExecutionException {try {Date date = new Date();String dd = " " + date.getMinutes() + ":" + date.getSeconds() + " ";System.out.println("sss1" + dd);//to do ..} catch (Exception e) {e.printStackTrace();}}}

在使用并发的情况下,当Job执行时间超过间隔时间时,调度框架为了能让任务按照我们预定的时间间隔执行,会马上启用新的线程执行任务

再次强调,spring4 quartz最多可以为我们开启十个线程,当我们需要执行的任务有锁的情况下,那么在十个线程用完之后,定时器没有线程可以开启,这时候就会出现定时任务的时间间隔超过我们设定的时间间隔;

我们怎么解决这个情况呢?

一、优化我们执行的job,使其在设定的时间间隔内执行完;

二、设置时间间隔更长一点;

我们再来看看串行执行和并发执行的区别:

下面是串行执行时,每个线程的执行情况:

我们可以看到,每个定时任务是在job完成之后才会开启新的线程来执行下一个job;

下面看看并发执行,每个线程执行的情况:

我们可以看到,定时任务是按照我们设置的时间间隔执行的,不会在意job是否执行完,如果没有执行完,定时任务会开启一个新的线程来执行job;

转载于:https://www.cnblogs.com/talkingcat/p/10833155.html

Spring4定时器 cronTrigger和simpleTrigger实现方法相关推荐

  1. linux系统中定时器使用方法,Linux下实现定时器Timer的几种方法

    使用sleep()和usleep() 其中sleep精度是1秒,usleep精度是1微妙,具体代码就不写了.使用这种方法缺点比较明显,在Linux系统中,sleep类函数不能保证精度,尤其在系统负载比 ...

  2. linux的 定时器传参数,JavaScript 定时器调用传递参数的方法

    JavaScript定时器调用传递参数的方法,需要的朋友可以参考下. 无论是window.setTimeout 还是window.setInterval,在使用函数名作为调用句柄时都不能带参数,而在许 ...

  3. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  4. python timer使用-关于定时器的两种使用方法

    在发现Python自身的API在这方面没有很好支持这种情况下,想要使用Timer功能的话,除了第三方的模块外,还可以通过使用标准库为我们提供的sched模块和Timer类.这两个类不能算是真正的Tim ...

  5. Qt中定时器使用的两种方法

    Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...

  6. 【转】Android中定时器的3种实现方法

    原文网址:http://www.android-study.com/pingtaikaifa/508.html 在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与线程的s ...

  7. C#winform定时器的两种使用方法

    第一种方法:直接拖Timer控件,然后设置参数,给定触发的内容: 1.拖Timer控件: 2.修改interval属性确定时间间隔: 3.双击timer1控件,给双击事件tick里面写触发的事件: 4 ...

  8. stm32编码器正反转计数程序_第六章:STM32CubeMx 定时器编码器模式基本使用方法...

    前言: 增量式编码器在实际应用中还是很常见.stm32的定时器带的也有编码器模式.所用的编码器是有ABZ三相,其中ab相是用来计数,z相输出零点信号.AB相根据旋转的方向不同,输出的波形如下图所示: ...

  9. Android中定时器的3种实现方法

    原文:http://blog.csdn.net/wulianghuan/article/details/8507221 在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与 ...

最新文章

  1. 网管员应掌握好的学习方法
  2. mysql的远程链接工具_Navicat远程链接mysql-8数据库具体操作
  3. Asp.net生成Excel文件并下载(解决使用迅雷下载页面而不是文件的问题)
  4. qt中用mysql获取所有的数据库、数据库中的表名
  5. Ubuntu配置伪分布式hadoop时报错:localhost: mkdir: 无法创建目录/usr/local/hadoop/logs: 权限不够...
  6. shiro 散列加盐(salt) 次数的效果
  7. windows10访客_如何在Windows 10中创建访客帐户
  8. 【渝粤题库】陕西师范大学152103 公共行政学
  9. 手机浏览器网址_打开URL(在其他应用中访问网址)app下载-打开URL(在其他应用中访问网址)v2.6安卓版下载...
  10. 从零开始学前端:CSS字体属性和文本属性 --- 今天你学习了吗?(CSS:Day08)
  11. selenium 定位方式4-xpath
  12. [web]EL表达式失效
  13. Java ResourceBundle 加载外部路径资源文件方式
  14. Intro.js 简介和用法
  15. 学习云计算需要哪些软件,需要什么知识面?
  16. linux虚拟机释放内存cache
  17. JAVA计算机毕业设计藏宝阁游戏交易系统Mybatis+系统+数据库+调试部署
  18. 提高网吧上座率,TG-NET网吧光纤万兆方案
  19. STM32入门笔记——GPIO的初始化
  20. 提升搜索引擎的友好度只要五个步骤

热门文章

  1. python抓取微博数据中心_微博爬虫开源项目汇总大全
  2. 实现图片模糊(背景虚化)
  3. 【中级软考—软件设计师】2操作系统2.9 文件管理【***】:2.9.4 索引文件
  4. Clonezilla--系统克隆
  5. mac 软件分享平台
  6. 【010】汉典-纯粹的汉语字典数据库
  7. NSGA-II算法的学习笔记
  8. 关于DDoS攻击,这些基本概念你一定要知道!
  9. centos8 yum太慢_如何提高Linux安装软件的速度?给CentOS8配置DNF/YUM国内下载源
  10. 学会扒源码-HashMap