使用spring整合quartz进行定时器调用(图文案例)

现实中用到定时器的功能太多了,比如闹钟,设置定时音乐。。。
本人毕设中考勤功能也需要用到定时器(下面链接可查看):
https://blog.csdn.net/C_bianchengxiaobai/article/details/102619557
比如对考勤表的信息每天指定时间进行初始化,需要用到定时器。spring提供的定时器主要有两种:spring task和spring quartz,前者是基于jdk下的juc包的封装,后面是定时器的框架,本例使用后者。

由于spring只提供接口,使用quartz需要导入jar包:
在这里插入图片描述
在这里插入图片描述
在spring的xml文件配置定时器先需要了解三个概念:Job,Trigger,Scheduler
job:指的是一个作业,工作,通俗讲是哪段代码被定时调用
Trigger:触发器,触发器一般包含Job,给Job指定一个执行时刻,可以为某年某天某月某日某时某分某秒,

Scheduler:调度器(定时器),调度触发器,并按照指定的时间执行job。

下面开始写Job,Job的定义spring官网配置给出两种方式:
在这里插入图片描述
在这里插入图片描述
上面这种方式需要继承QuartzJobBean,实现红框的方法,,定时器执行时实际是调用该方法。该方法有一个JobExecutionContext 参数,这个参数可以获得该Job的属性,比如可以获得timeout。

接下来介绍第二种方式:
在这里插入图片描述
在这里插入图片描述
第二种方式不需要实现方法,只需要配置Job和需要的定时执行方法,同时把该Job加入ioc中,本例采用第二种方法,下面给出Job:
在这里插入图片描述
在这里插入图片描述
上面红色框配置主要是并发配置,true为并发执行(默认),false为非并发执行。

下面设置触发器Trigger ,先看spring官方给出的触发器配置:
在这里插入图片描述
第一种为简单触发器,只能设置指定一些简单的时刻,比如开始时间,每隔几秒执行,等等。
第二种指定时间非常强大,看红色框,有个属性cronExpression,值为一堆数字,关于cronExpression格式可以看一下链接:

https://www.cnblogs.com/xielong/p/6043318.html

本例使用第二种触发器,配置自己的触发器:
在这里插入图片描述
红框的意思是时间到5,15,20,25,35,45,55秒定时器执行任务。

最后再配置Scheduler,spring官方给出的是SchedulerFactoryBean:
在这里插入图片描述
下面配置自己的调度器:
在这里插入图片描述

接下来测试该定时器:
在这里插入图片描述

结果:
在这里插入图片描述
结果出来了。

这里有两个坑:
第一个,也是最大的一个,测试方法不能写在junit,不然会执行不了:
在这里插入图片描述
明明写了Job却提示没有Job,原因是因为junit不能测试多线程的东西,而quartz是在线程中去执行的。所以不能。涉及到线程的测试最好用main函数去测试,或者使用GroboUtils等支持多线程的框架+junit,具体可以百度一下GroboUtils+junit即可。

第二个坑是调度工厂,比如把测试方法该写如下:
在这里插入图片描述
会出现异常:
在这里插入图片描述
在这里插入图片描述
不过这并不影响定时器的调用,该异常:org.quartz.impl.StdScheduler cannot be cast to org.springframework.scheduling.quartz.SchedulerFactoryBean,意思是StdScheduler 无法转换为SchedulerFactoryBean,
测试下:
在这里插入图片描述
发现该类实例为:
在这里插入图片描述
也就是SchedulerFactoryBean返回的实例是StdScheduler

最后再测下:
在这里插入图片描述
在这里插入图片描述
发现直接实例化容器,定时器也能执行,因为定时器的配置全都在ioc容器里,所以当容器启动时候,定时器也就执行了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值