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笔记的更多相关文章

  1. SpringBoot中的Quartz应用

    Spring自带定时器任务: code: import org.springframework.beans.factory.annotation.Configurable; import org.sp ...

  2. 在springboot项目中引入quartz任务调度器。

    quartz是一个非常强大的任务调度器.我们可能使用它来管理我们的项目,常见的是做业绩统计等等.当然它的功能远不止这些.我们在这里不介绍quartz的原理,下面讲讲如何在springboot中使用qu ...

  3. SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存

    1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...

  4. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  5. SpringBoot学习笔记(4)----SpringBoot中freemarker、thymeleaf的使用

    1. freemarker引擎的使用 如果你使用的是idea或者eclipse中安装了sts插件,那么在新建项目时就可以直接指定试图模板 如图: 勾选freeMarker,此时springboot项目 ...

  6. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  7. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

  8. SpringBoot图文教程5—SpringBoot 中使用Aop

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  9. SpringBoot图文教程6—SpringBoot中过滤器的使用

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文系列教程技术大纲 鹿老师的Java笔记 SpringBo ...

随机推荐

  1. 使用python快速搭建本地网站

    如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS,Nodejs等.那么, Python 可能帮助你.使用Python可以完成一个简 ...

  2. IE 出现stack overflow 报错的原因归纳

    1. 重定义了系统的触发事件名称作为自定义函数名如:  onclick / onsubmit ...  都是系统保留的事件名称,不允许作为重定义函数名称: 2. IE缓存满了,无法写入.解决办法:清空 ...

  3. [Spark RDD_1] RDD 基本概念

    0. 说明 RDD 概述 && 创建 RDD 的方式 && RDD 编程 API(Transformation 和 Action Operations) &&a ...

  4. Win7命令终端基础配色指南

    微软对控制台字体的元数据有严格的限制,https://support.microsoft.com/zh-cn/help/247815/necessary-criteria-for-fonts-to-b ...

  5. Hadoop HBase概念学习系列之HRegion服务器(三)

    所有的数据库数据一般是保存在Hadoop分布式系统上面的,用户通过一系列HRegion服务器获取这些数据.一台机器上一般只运行一个HRegion服务器,而且每一分区段的HRegion也只会被一个HRe ...

  6. mysql host'XXX' is not allowed to connect to this mysql server

    错误的原因一般是没有添加 IP可远程的权限. 首先以 root 帐户登陆 MySQL 1.在 Windows 主机中点击开始菜单,运行,输入“cmd”,进入控制台,然后cd 进入MySQL 的 bin ...

  7. 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 ...

  8. KMP、扩展KMP、Manacher习题

    照着这篇博客刷一下. 自己也做一下笔记 对于KMP算法,可以看我之前总结的这篇博客 hdu 3613 Best Reward 给一个字符串,字符由a~z构成,每个字符有一个权值.在某一点将字符串切成2 ...

  9. Django商城项目笔记No.8用户部分-注册接口实现

    Django商城项目笔记No.8用户部分-注册接口实现 users的view.py中增加如下代码 class RegisterUserView(CreateAPIView): "" ...

  10. 【SDOI2011 第2轮 DAY1】消防 -[树的直径+树链剖分][解题报告]

    [SDOI2011 第2轮 DAY1]消防 题面: SDOI2011 第2轮 DAY1]消防 时间限制 : 20000 MS 空间限制 : 565536 KB 问题描述 时限\(2s\) 某个国家有\ ...