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. 使用 Azure 门户创建 Windows 虚拟机

    可以通过 Azure 门户创建 Azure 虚拟机. 此方法提供一个基于浏览器的用户界面,用于创建和配置虚拟机和所有相关的资源. 本快速入门介绍了如何创建虚拟机并在 VM 上安装 webserver. ...

  2. SQLServer导数据到Oracle

    从SQLServer导数据到Oracle大概有以下几种方法: 使用SSMS的导出数据向导,使用Microsoft ODBC for Oracle或Oracle Provider for OLE DB连 ...

  3. Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL

    It is everywhere in the world of MySQL that if your replication is broken because an event caused a ...

  4. 56_实现类似spring的可配置的AOP框架

    > config.properties  配置文件   key=类名 > BeanFactory  Bean工厂,负责得到bean  getBean("xxx") &g ...

  5. Linux运维之——每日小技巧,使用awk命令截取每行的指定列数据

    获取/etc/passwd目录下的UID值小于10的数,并输出第一.三列 [root@:vg_adn_tidbCkhsTest:172.31.30.62 ~]#cat /etc/passwd | aw ...

  6. Docker容器学习与分享10

    Docker容器向外提供服务 用分享04中的Nginx服务来试一下. 不过这次我直接用Nginx镜像创建容器,先下载Nginx镜像. [root@promote ~]# docker search n ...

  7. [技术] OIer的C++标准库 : 字符串库

    引入 上次我在博客里介绍了OI中可能用到的STL中的功能, 今天我们接着来发掘C++标准库中能为OI所用的部分. 点击传送至我的上一篇系列博文 众所周知, OI中经常用到字符串相关的处理, 这时善用字 ...

  8. Python接口自动化--post提交的四种数据类型 4

    常见的post请求提交的数据类型有四种: 1.第一种:application/json:这是最常见的json格式,如下 {"input1":"XXX",&quo ...

  9. 2.Dubbo2.5.3注册中心和监控中心部署

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.注册中心Zookeeper安装 (1)搭建要求 zk服务器集群规模不小于3个节点要求各服务器之间系统时间要 ...

  10. Effective MySQL之SQL语句最优化——读书笔记之一

    第一章,DBA5分钟速成 本章知识点如下: 寻找运行慢SQL的语句: show full processlist查看所有正在执行的进程及执行的语句耗时: 命令后面\G可以让命令按行显示(默认是按列). ...