定时器--Spring--SpringBoot

来源:互联网 发布:淘宝香港代购好的店铺 编辑:程序博客网 时间:2024/06/17 16:48

SpringBoot定时器

最近在写项目时,遇见一个需求:做一个任务队列,并分配出相应的接口给任务系统使用;同时还要定时检测数据库中是否有新的任务没有添加到队列中。做队列操作,Java中有提供相应的API–Queue,同List一样,Queue也是继承于Collection接口,具体的操作不在这里详细介绍,可自行查询相关API文档。

在Spring中,有集成的定时器功能:分别是TimerTask和Quartz,我们只需要拿过来直接用即可。在本文中,不详细的说明这两者的区别,只拿过来用。当然在Spring框架中,有属于Spring自己的定时器ScheduledTask,这个定时器相当于轻量级的Quartz,本文中的使用就是以Quartz为例。

一.精确度和功能

Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。Quartz拥有TimerTask所有的功能,而TimerTask则没有。

二. 任务类的数量

Quartz每次执行都创建一个新的任务类对象。TimerTask则每次使用同一个任务类对象。

三. 异常的处理

Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务TimerTask则不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务。

四.使用方法

在SpringBoot中,想使用定时器很简单,不需要配置xml文件,只需要加上注解既可。

首先在入口类加上@EnableScheduling注解,以便系统开启任务计划;如果不加这个注解,定时器是无法正常使用的。然后创建相应的方法,并在方法上加上@Scheduled注解,这个注解大致有五种参数:详细见下图

我在这里主要使用了initialDelay和fixedDelay,其中initialDelay是设定定时器第一次启动时间,我这里设定的是项目启动10分钟后开始执行定时器,那么对应的值就是1000*60*10,由此可见,该属性的值是以毫秒数为单位。fixedDelay是设定定时器固定执行的频率,比如我这里设定的是定时任务开启后,每隔1分钟执行一次,对应的属性值就是1000*60。如果你想在项目启动时,就执行定时器,那么请使用cron表达式。具体代码如下:

@Scheduled(cron="0 0 12 * * ?")

这个意思是设定定时器在每天中午的12点执行,如果你想设定其它时间执行,请参考cron表达式的写法:

"0 0 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分每分钟一次触发 "0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发 "0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 "0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发 "0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发 "0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发 
原创粉丝点击