Quartz的简单使用和与Spring的整合

来源:互联网 发布:李开元 知乎 编辑:程序博客网 时间:2024/05/16 01:35

1、什么是Quartz

     Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。简单地创建一个org.quarz.Job接口的Java类,Job接口包含唯一的方法:

  public void execute(JobExecutionContext context) throws JobExecutionException;
      在Job接口实现类里面,添加需要的逻辑到execute()方法中。
2、Quartz中核心接口之间的关系

      

3、定时执行的Quartz

      3.1 任务类的实现

            需要实现Quartz中的Job接口

public class HelloJob implements Job {public HelloJob() {}public void execute(JobExecutionContext context)throws JobExecutionException {// 输出当前时间System.out.println("Hello World! - " + new Date());}}

      3.2 任务调度的实现

           为了调度此任务执行,需要先得到一个Schedule实例,然后创建一个包含任务信息的JobDetail,最后创建一个Trigger管理任务的执行。

import static org.quartz.DateBuilder.evenMinuteDate;import static org.quartz.JobBuilder.newJob;import static org.quartz.TriggerBuilder.newTrigger;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Date;public class SimpleExample {public void run() throws Exception {Logger log = LoggerFactory.getLogger(SimpleExample.class);// 定义调度器SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();// 获取当前时间的下一分钟Date runTime = evenMinuteDate(new Date());// 定义job// 在quartz中,有组的概念,组+job名称 唯一标识JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();// 定义触发器,在下下一分钟启动Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();// 将job注册到调度器sched.scheduleJob(job, trigger);log.info(job.getKey() + " will run at: " + runTime);// 启动调度器sched.start();// 等待65秒System.out.println("------- Waiting 65 seconds... -------------");try {// wait 65 seconds to show jobThread.sleep(65L * 1000L);// executing...} catch (Exception e) {//}// 关闭调度器sched.shutdown(true);}public static void main(String[] args) throws Exception {SimpleExample example = new SimpleExample();example.run();}}

4、使用表达式的Quartz

      4.1 任务类的实现

public class HelloJob implements Job {public HelloJob() {}public void execute(JobExecutionContext context)throws JobExecutionException {// 输出当前时间System.out.println("Hello World! - " + new Date());}}

      4.2 任务调度的实现

import static org.quartz.CronScheduleBuilder.cronSchedule;import static org.quartz.DateBuilder.evenMinuteDate;import static org.quartz.JobBuilder.newJob;import static org.quartz.TriggerBuilder.newTrigger;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Date;public class SimpleCronExample {public void run() throws Exception {Logger log = LoggerFactory.getLogger(SimpleCronExample.class);// 定义调度器SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();// 获取当前时间的下一分钟Date runTime = evenMinuteDate(new Date());// 定义job// 在quartz中,有组的概念,组+job名称 唯一标识JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();// 定义触发器,2秒执行一次Trigger trigger = newTrigger().withIdentity("trigger1", "group1").withSchedule(cronSchedule("0/2 * * * * ?")).build();// 将job注册到调度器sched.scheduleJob(job, trigger);log.info(job.getKey() + " will run at: " + runTime);// 启动调度器sched.start();// 等待1分钟try {Thread.sleep(60L * 1000L);} catch (Exception e) {//}// 关闭调度器sched.shutdown(true);}public static void main(String[] args) throws Exception {SimpleCronExample example = new SimpleCronExample();example.run();}}

5、Quartz与Spring的整合

      5.1 applicationContext-quartz.xml的实现

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><!-- 定义任务bean --><bean name="myJobDetail"class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><!-- 指定具体的job类 --><property name="jobClass" value="cn.quartz.spring.MyJob" /><!-- 指定job的名称 --><property name="name" value="myJob" /><!-- 指定job的分组 --><property name="group" value="myJobs" /><!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 --><property name="durability" value="true" /><!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 --><property name="applicationContextJobDataKey" value="applicationContext" /></bean><!-- 定义触发器 --><!-- 一个任务,可以对应多个调度器 --><!-- 一个调度器,只能对应一个任务 --><bean id="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="myJobDetail" /><!-- 每5秒执行一次 --><property name="cronExpression" value="0/5 * * * * ?" /></bean><!--用于演示,一个job可以对应多个触发器 --><bean id="cronTrigger2"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="myJobDetail" /><!-- 每8秒执行一次 --><property name="cronExpression" value="0/6 * * * * ?" /></bean><!-- 定义调度器 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger" /><ref bean="cronTrigger2" /></list></property></bean></beans>

      5.2 任务的实现

import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.context.ApplicationContext;import org.springframework.scheduling.quartz.QuartzJobBean;public class MyJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context)throws JobExecutionException {System.out.println("myJob 执行了 ......"+ context.getTrigger().getKey().getName());ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap().get("applicationContext");System.out.println("获取到的Spring的容器是: " + applicationContext);// 在这里通过获取到的Spring的容器,获取数据库的Dao,来操作数据库}}

      5.3 测试代码

import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestSpring {public static void main(String[] args) {// 开启Spring容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-quartz.xml");}}

6、总结

      在Quartz的使用中要注意的是,一个任务,可以对应多个调度器; 一个调度器,只能对应一个任务 。

7、源码下载

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩智力轻度低下该怎么办 发侮辱人的信息怎么办 宋民国表情我能怎么办 苹果手机微信弄成听筒模式怎么办 我的小可爱丢了怎么办 法斗犬老是皮肤病看也看不好怎么办 项链水晶不亮了怎么办 美甲画画手抖怎么办 微信中的表情符号不全怎么办 球球大作战找不到团战服务器怎么办 小孩的腰有点弯怎么办 小朋友不听话被老师罚站怎么办 幼儿园小朋友被老师罚站怎么办 生完小孩弯腰驼背怎么办 小孩爱捡垃圾是怎么办 腰扭了不敢弯腰怎么办 小人狗在背后骂我怎么办 微信表情缺失了怎么办 动图过大 微信 怎么办 我能怎么办图片带字 我该怎么办图片带字 学化妆找不到模特练妆怎么办? cf进房间闪退怎么办 手游cf账号封了怎么办 大门牙缺了一块怎么办 缺了一颗牙齿怎么办 CF购买医疗包竞猜币没到账怎么办 CF手游昵称不合法怎么办 微信gif尺寸过大怎么办 微信表情上限300怎么办 太受欢迎了怎么办快穿 兔宝宝沾上人气味怎么办 我该怎么办的文字图片 爱奇艺缓存视频显示下载失败怎么办 把老公惹生气了怎么办 苹果x用电量太快怎么办 小中考地生没过怎么办 如果遇到不负责的语文老师怎么办 孩子的语文老师教的不好怎么办 刚买的小猫很凶怎么办 2月幼犬不吃东西怎么办