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 ...
随机推荐
- 使用python快速搭建本地网站
如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS,Nodejs等.那么, Python 可能帮助你.使用Python可以完成一个简 ...
- IE 出现stack overflow 报错的原因归纳
1. 重定义了系统的触发事件名称作为自定义函数名如: onclick / onsubmit ... 都是系统保留的事件名称,不允许作为重定义函数名称: 2. IE缓存满了,无法写入.解决办法:清空 ...
- [Spark RDD_1] RDD 基本概念
0. 说明 RDD 概述 && 创建 RDD 的方式 && RDD 编程 API(Transformation 和 Action Operations) &&a ...
- Win7命令终端基础配色指南
微软对控制台字体的元数据有严格的限制,https://support.microsoft.com/zh-cn/help/247815/necessary-criteria-for-fonts-to-b ...
- Hadoop HBase概念学习系列之HRegion服务器(三)
所有的数据库数据一般是保存在Hadoop分布式系统上面的,用户通过一系列HRegion服务器获取这些数据.一台机器上一般只运行一个HRegion服务器,而且每一分区段的HRegion也只会被一个HRe ...
- mysql host'XXX' is not allowed to connect to this mysql server
错误的原因一般是没有添加 IP可远程的权限. 首先以 root 帐户登陆 MySQL 1.在 Windows 主机中点击开始菜单,运行,输入“cmd”,进入控制台,然后cd 进入MySQL 的 bin ...
- October 16th 2017 Week 42nd Monday
The more decisions that you are forced to make alone, the more you are aware of your freedom to choo ...
- KMP、扩展KMP、Manacher习题
照着这篇博客刷一下. 自己也做一下笔记 对于KMP算法,可以看我之前总结的这篇博客 hdu 3613 Best Reward 给一个字符串,字符由a~z构成,每个字符有一个权值.在某一点将字符串切成2 ...
- Django商城项目笔记No.8用户部分-注册接口实现
Django商城项目笔记No.8用户部分-注册接口实现 users的view.py中增加如下代码 class RegisterUserView(CreateAPIView): "" ...
- 【SDOI2011 第2轮 DAY1】消防 -[树的直径+树链剖分][解题报告]
[SDOI2011 第2轮 DAY1]消防 题面: SDOI2011 第2轮 DAY1]消防 时间限制 : 20000 MS 空间限制 : 565536 KB 问题描述 时限\(2s\) 某个国家有\ ...