Quartz和Spring Task定时任务的简单应用和比较
看了两个项目,一个用的是Quartz写的定时器,一个是使用spring的task写的,网上看了2篇文章,写的比较清楚,这里做一下留存
链接一、菠萝大象:http://www.blogjava.net/bolo/archive/2015/03/12/423408.html
连接二:http://huangrongyou.iteye.com/blog/1762869
一、Quartz
- 引入quartz的jar包。
- 配置文件中定义org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean,并指定它的targetObject属性为Job任务类,targetMethod属性为任务方法就可以了。
<bean id="job" class=" xx.xx.xx.Job" />
<bean id="cronTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="job" />
<property name="targetMethod" value="runWork" />
<!-- false表示job不会并发执行,默认为true-->
<property name="concurrent" value="false" />
</bean>
targetObject属性指定的任务类,有多种方式实现。
1、可以用@Component注解在类上面标注,这样就不用定义<bean id="job" ... />这些东西了。
2、可以按上面的写法来配置。
3、直接使用下面的写法。
<property name="targetObject">
<bean class="xx.xx.xx.Job" />
</property>
接下来配置触发器
<bean id="doWork" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="cronTask" />
<!—每天凌晨0点1分执行-->
<property name="cronExpression" value="0 01 00 * * ?" />
</bean>
最后配置调度工厂
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="doWork"/>
</list>
</property>
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 到此,整个配置就完成了。
- 时间参考:
“0/10 * * * * ?” 每10秒触发
“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触发
每隔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 * * ?
Spring Task
- Spring从3.0开始增加了自己的任务调度器,它是通过扩展java.util.concurrent包下面的类来实现的,它也使用Cron表达式。
- 使用spring task非常简单,首先增加命名空间schema
<beans xmlns="http://www.springframework.org/schema/beans"
......
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
......
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 然后给定时任务类添加@Component注解,给任务方法添加@Scheduled(cron = “0/5 * * * * ?”)注解,并让Spring扫描到该类。
然后加上这个配置,让Spring识别@Scheduled注解(org.springframework.scheduling.annotation.Scheduled)。 - 如果还想扩展一下,改成下面这样:
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
- 1
- 2
- 3
- 4
- 如果定时任务很多,可以配置executor线程池,这里executor的含义和java.util.concurrent.Executor是一样的,pool-size的大小官方推荐为5~10。scheduler的pool-size是ScheduledExecutorService线程池,默认为1。假如我设置了8个任务,每个任务都是每5秒钟执行一次,把下面的代码再复制7份再改一改,看看打印结果。
@Scheduled(cron = "0/5 * * * * ?")
public void work1(){
System.out.println(Thread.currentThread().getName()+" "+"work1: 每5秒执行一次");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 定时任务执行了3次,我们可以看到,线程名称都是以scheduler为前缀,这是因为我们已经在这段配置里定义了id为scheduler的结果,它就是用来作为任务线程的前缀,再交给executor线程池进行。3次任务执行,因为我们设定的任务调度线程池大小为5,所以,只有5个实例来处理这8个任务,从结果可以看出来,不是每次都会用上全部的5个实例。如果你系统中的定时任务过多,这个pool-size的大小就应该调大一点,方便之前定义的executor线程池来执行。
比较
转载的博主写了很多测试类,这里就不贴了,客官可以转到链接二查看,这里只写一下区别
- 精确度和功能
- Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。
- Quartz拥有SpringTask所有的功能,而TimerTask则没有。
- 任务类的数量
- Quartz每次执行都创建一个新的任务类对象。
- SpringTask则每次使用同一个任务类对象。
对异常的处理
- Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务。
- SpringTask不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务。
总结:还是第三方考虑的周全,东西比较多,加上Quartz配置简单,maven也就是多加一个jar包,所以一般情况下还是使用Quartz了。
转自: https://blog.csdn.net/zp437734552/article/details/51899275
Quartz和Spring Task定时任务的简单应用和比较的更多相关文章
- Spring task定时任务执行一段时间后莫名其妙停止的问题
前因: 我写了一个小项目,主要功能是用Spring task定时任务每天定时给用户发送邮件.执行了几个月一直没有问题,前几天,莫名其妙的突然不再发送邮件了. 只好花费一些时间来查看到底是什么原因造成的 ...
- Spring Quartz 和 Spring Task使用比较
Quartz 和 Spring Task执行时间对比: 1. Quartz同步模式:一个任务的两次执行的时间间隔是:“执行时间”和“trigger的设定间隔”的最大值 2. Task默认同步模式:一个 ...
- Spring Task 定时任务
所谓定时任务.就是依据我们设定的时间定时运行任务,就像定时发邮件一样,设定时间到了.邮件就会自己主动发送. 在Spring大行其道的今天,Spring也提供了其定时任务功能,Spring Task.同 ...
- Spring Task定时任务的配置和使用详解
spring中使用定时任务 1.基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.or ...
- Spring task定时任务
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Quartz cron 表达式(linux 定时器,java 定时任务,spring task定时任务)
原文地址:https://blog.csdn.net/feng27156/article/details/39293403 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但 ...
- [Java定时器]用Spring Task实现一个简单的定时器.
今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...
- spring mvc定时任务的简单使用
版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 说起定时任务,开发的小伙伴们肯定不陌生了.有些事总是需要计算机去完成的,而不是傻傻的靠我们自己去.可是好多人对定时器总感觉很陌 ...
- Spring Task定时任务Scheduled
Spring的任务调度,采用注解的形式 Spring中@Scheduled的用法. spring的配置文件如下,先扫描到任务的类,打开spirng任务的标签 <beans xmlns=" ...
随机推荐
- 10.6 ip:网络配置工具
ip命令是iproute软件包中的一个强大的网络配置工具,用于显示或管理Linux系统的路由.网络设备.策略路由和隧道. ip [option] [object] [command] ip [选项 ...
- 图解 Redis | 不就是 AOF 持久化嘛
AOF 日志 试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了 ...
- Qt 圆角按钮,面版自动布局
一.前言 在部分界面开发中,有时需要动态添加控件或按钮到面板中,在不需要时又需要删除该控件,故模仿视频开发中的设置屏蔽词,通过自己绘制的按钮与排布面板控件实现. 实现效果如下: 说明: 1.输入框可设 ...
- vmware workstation linux虚拟机点击suspend会卡死
vmware workstation linux虚拟机点击suspend会卡死, 现象如图, 我测过很多发行版都有这个问题 临时解决方案是关闭suspend功能 sudo systemctl mask ...
- AICompiler动态shape编译框架
AICompiler动态shape编译框架 移动互联网的兴起,不仅产生了海量数据,也对人机交互有了新的定义.企业如何动态处理不同规格图片数据,如何更灵活处理不同长度的对话语料等等,提升企业运营效率,争 ...
- HashMap底层实现原理及面试常见问题
HashMap底层源码分析 1.HashMap底层采用的存储结构 1.在JDK1.7及之前采用的存储结构是数组+链表 2.到了JDK1.8之后采用的是数组+链表+红黑树 2.HashMap实现的原理 ...
- 记一次项目中解决 -- 并发减库存超卖问题过程(Java)
起因:项目中要做预约功能,首先每天的余票都是有上限的,自然不能出现超卖的情况 基于我们项目是单体分布式的springcloud部署,我想了下 第一种方法,直接mysql加行锁,要update这条库存数 ...
- markdown写ppt (史上最全)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- oracle中job无法正常运行,如何排查
1.生产环境Oracle中的job无法正常运行 select * from dba_jobs_running;(查看正在运行的job) 2.select * from dba_jobs(查看job历史 ...
- 为你的Go应用创建轻量级Docker镜像?
缩小Go二进制文件大小 环境 youmen@youmendeMacBook-Pro % gcc -dumpversion 12.0.5 youmen@youmendeMacBook-Pro % go ...