SpringBoot中使用Quartz笔记
Quartz可以用来做什么?
Quartz是一个任务调度框架,可用来做定时任务。
吧啦吧啦.........
还是直接上代码。
application.properties 配置文件。
job.calculateTriggerCron= * * ? //秒,分钟,小时,天,月,年,星期 这个配置的意思是 每天的 23:0:0
QuartzPropertyConfig类 配置的实体化类。
@Configuration
public class QuartzPropertyConfig { /**
* 清算任务
*/
@Value("${job.calculateTriggerCron}")
private String calculateTriggerCron; public String getCalculateTriggerCron() {
return calculateTriggerCron;
} public void setCalculateTriggerCron(String calculateTriggerCron) {
this.calculateTriggerCron = calculateTriggerCron;
}
}
CalculateJob类 这个类用来实现定时具体需要执行的操作
@DisallowConcurrentExecution
public class CalculateJob implements Job { //必须是实现Job接口喔
@Resource
private CalculateService calculateService;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// 具体执行操作 }
}
//CalculateService是配置在spring容器中的,而CalculateJob则是配置在Quartz数据库中,由org.springframework.scheduling.quartz.SpringBeanJobFactory
// 运行时调用protected ObjectcreateJobInstance(TriggerFiredBundle bundle) throws Exception;
方法创建的。
// 所以我们等会把 Quartz中的job自动注入spring容器托管的对象
CalculateTask类 这个类中主要用来设置 JobDetailFactoryBean类 和 CronTriggerFactoryBean类
@Configuration
public class CalculateTask { //时间配置文件
@Resource
private QuartzPropertyConfig zKQuartzConfig; @Bean(name="calculate")
public JobDetailFactoryBean jobDetailFactoryBean(){
//生成JobDetail
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(CalculateJob.class); //设置对应的Job
factory.setGroup("calculateGroup");
factory.setName("calculateJob");
return factory;
} @Bean(name="calculateTrigger")
public CronTriggerFactoryBean cronTriggerFactoryBean(){
CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
//设置JobDetail
stFactory.setJobDetail(jobDetailFactoryBean().getObject());
stFactory.setStartDelay(1000);
stFactory.setName("calculateTrigger");
stFactory.setGroup("calculateGroup");
stFactory.setCronExpression(zKQuartzConfig.getCalculateTriggerCron()); //定时任务时间配置
return stFactory;
}
}
AutowiringSpringBeanJobFactory类,这个类用来Quartz中的job自动注入spring容器托管的对象 【这个类直接复制用就行了,不用做任何修改】
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory;
//Spring提供了一种机制让你可以获取ApplicationContext。就是ApplicationContextAware
接口。
//对于一个实现了ApplicationContextAware
接口的类,Spring会实例化它的同时
//调用它的public voidsetApplicationContext(ApplicationContext applicationContext) throws BeansException;
接口,将该bean所属上下文传递给它。
@Override
public void setApplicationContext(final ApplicationContext context) {
beanFactory = context.getAutowireCapableBeanFactory();
} @Override
protected Object createJobInstance(final TriggerFiredBundle bundle)
throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);
return job;
}
}
Quartz中的job如何自动注入spring容器托管的对象 更多可以查看 http://ju.outofmemory.cn/entry/75776
QuartzConfig类 这个类用来设置配置 SchedulerFactoryBean
@Configuration
public class QuartzConfig { @Autowired
@Qualifier("calculateTrigger")
private CronTriggerFactoryBean calculateTrigger;
//Quartz中的job自动注入spring容器托管的对象
@Bean
public AutowiringSpringBeanJobFactory autoWiringSpringBeanJobFactory() {
return new AutowiringSpringBeanJobFactory();
} @Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
scheduler.setJobFactory(autoWiringSpringBeanJobFactory()); //配置Spring注入的Job类 固定不变
scheduler.setTriggers( // SchedulerFactoryBean 中 必须设置 List<Trigger> triggers; 参数(triggers是个list容器) 对应方法 setTriggers(Trigger... triggers);
calculateTrigger.getObject()
,tempTrigger.getObject()
// ...
); //这里可以设置多个CronTriggerFactoryBean
return scheduler;
}
}
Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 允许的值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日 1-31 , - * ? / L W C
月 1-12 or JAN-DEC , - * /
周几 1-7 or SUN-SAT , - * ? / L C #
年(可选字段) empty 1970-2099 , - * /
字符含义:
* :代表所有可能的值。因此,“*”在Month中表示每个月,在Day-of-Month中表示每天,在Hours表示每小时
- :表示指定范围。
, :表示列出枚举值。例如:在Minutes子表达式中,“5,20”表示在5分钟和20分钟触发。
/ :被用于指定增量。例如:在Minutes子表达式中,“0/15”表示从0分钟开始,每15分钟执行一次。"3/20"表示从第三分钟开始,每20分钟执行一次。和"3,23,43"(表示第3,23,43分钟触发)的含义一样。
? :用在Day-of-Month和Day-of-Week中,指“没有具体的值”。当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为“?”。例如:想在每月20日触发调度,不管20号是星期几,只能用如下写法:0 0 0 20 * ?,其中最后以为只能用“?”,而不能用“*”。
L :用在day-of-month和day-of-week字串中。它是单词“last”的缩写。它在两个子表达式中的含义是不同的。
在day-of-month中,“L”表示一个月的最后一天,一月31号,3月30号。
在day-of-week中,“L”表示一个星期的最后一天,也就是“7”或者“SAT”
如果“L”前有具体内容,它就有其他的含义了。例如:“6L”表示这个月的倒数第六天。“FRIL”表示这个月的最后一个星期五。
注意:在使用“L”参数时,不要指定列表或者范围,这样会出现问题。
W :“Weekday”的缩写。只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第 16天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在 day-of-month指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日,即最后一个星期五。
# :只能用在day-of-week字段。用来指定这个月的第几个周几。例:在day-of-week字段用"6#3" or "FRI#3"指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。
表达式例子:
0 * * * * ? 每1分钟触发一次
0 0 * * * ? 每天每1小时触发一次
0 0 10 * * ? 每天10点触发一次
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 30 9 1 * ? 每月1号上午9点半
0 15 10 15 * ? 每月15日上午10:15触发
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0 12 ? * WED 表示每个星期三中午12点
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 0 23 L * ? 每月最后一天23点执行一次
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
以下是我自己看源码时随意记的笔记。请忽略(私人可见)
Quartz 配置使用关系网
一 SchedulerFactoryBean 中 必须设置 List<Trigger> triggers; 参数(triggers是个list容器) 对应方法 setTriggers(Trigger... triggers);
二 可以使用 CronTriggerBean类 或 CronTriggerFactoryBean类 实例triggers (这两个类已经实现了Trigger接口)
必须设置 JobDetail jobDetail; 对应方法 setJobDetail(JobDetail jobDetail), 因为JobDetail中 有Trigger接口中必须的 JobKey 参数
必须设置 setCronExpression(String cronExpression); cronExpression就是定时任务时间配置 例如
三 需要设置 JobDetail 实例了,我们会实现一个JobDetailFactoryBean类, 在这个类中必须赋值的有 jobClass 参数;对应方法 setJobClass(Class<?> jobClass);
而jobClass就是定时任务的具体实现了
四 编写jobClass。写个类 实现 org.quartz.Job 接口,重新execute()方法。定时需要执行的具体步骤放在这个方法里。
SpringBoot中使用Quartz笔记的更多相关文章
- SpringBoot中的Quartz应用
Spring自带定时器任务: code: import org.springframework.beans.factory.annotation.Configurable; import org.sp ...
- 在springboot项目中引入quartz任务调度器。
quartz是一个非常强大的任务调度器.我们可能使用它来管理我们的项目,常见的是做业绩统计等等.当然它的功能远不止这些.我们在这里不介绍quartz的原理,下面讲讲如何在springboot中使用qu ...
- SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...
- SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理
在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...
- SpringBoot学习笔记(4)----SpringBoot中freemarker、thymeleaf的使用
1. freemarker引擎的使用 如果你使用的是idea或者eclipse中安装了sts插件,那么在新建项目时就可以直接指定试图模板 如图: 勾选freeMarker,此时springboot项目 ...
- SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能
在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...
- SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证
整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...
- SpringBoot图文教程5—SpringBoot 中使用Aop
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- SpringBoot图文教程6—SpringBoot中过滤器的使用
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文系列教程技术大纲 鹿老师的Java笔记 SpringBo ...
随机推荐
- 转:log4net使用详解
说明:本程序演示如何利用log4net记录程序日志信息.log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括M ...
- Unity By Reflection Update Scripts
App热更新需求 我正在使用Unity 3D开发一个Android的应用,它会下载AssetBundles并加载它们的内容,但由于AssetBundles不能包含脚本,我将使用预编译的C#脚本,并使用 ...
- python虚拟环境 -- virtualenv , virtualenvwrapper
virtualenv -- python虚拟沙盒 有人说:virtualenv.fabric 和 pip 是 pythoneer 的三大神器. 一.安装 pip install virtualenv ...
- Python实例---爬取下载喜马拉雅音频文件
PyCharm下python爬虫准备 打开pycharm 点击设置 点击项目解释器,再点击右边+号 搜索相关库并添加,例如:requests 喜马拉雅全网递归下载 打开谷歌/火狐浏览器,按F12打开开 ...
- Docker容器学习与分享10
Docker容器向外提供服务 用分享04中的Nginx服务来试一下. 不过这次我直接用Nginx镜像创建容器,先下载Nginx镜像. [root@promote ~]# docker search n ...
- November 13th, 2017 Week 46th Monday
Don't undermine your worth by comparing yourself with others. 别拿自己和他人比较,这只会降低你原有的价值. Honestly, I don ...
- Vue图片懒加载
图片懒加载的原理 先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src).当js监听到该图片元素进入可视窗口时,即将自定义属性 ...
- BZOJ 1934 善意的投票
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1934 题目大意: 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问 ...
- python第二十八课——编码小常识
2.内存和硬盘: 内存:计算机硬件组成部分之一,它是一个容器,用来存储数据:处理数据速度快, 存储数据量小:断电死机数据会丢失,短暂性存储数据 硬盘:计算机硬件组成部分之一,它是一个容器,用来存储数据 ...
- PHPer是草根吗
以下文字并没有非常多的技术词汇,所以只要对PHP感兴趣的人都可以看看. PHPer是草根吗? 从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务.同时,作为针对Web开发量身定制的脚本 ...