Quartz的简单使用和与Spring的整合
2016-12-27 16:14
513 查看
1、什么是Quartz
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。简单地创建一个org.quarz.Job接口的Java类,Job接口包含唯一的方法:
2、Quartz中核心接口之间的关系
![](https://img-blog.csdn.net/20161227160336988)
3、定时执行的Quartz
3.1 任务类的实现
需要实现Quartz中的Job接口
3.2 任务调度的实现
为了调度此任务执行,需要先得到一个Schedule实例,然后创建一个包含任务信息的JobDetail,最后创建一个Trigger管理任务的执行。
4、使用表达式的Quartz
4.1 任务类的实现
4.2 任务调度的实现
5、Quartz与Spring的整合
5.1 applicationContext-quartz.xml的实现
5.2 任务的实现
5.3 测试代码
6、总结
在Quartz的使用中要注意的是,一个任务,可以对应多个调度器; 一个调度器,只能对应一个任务 。
7、源码下载
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 job Thread.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://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.xsd http://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 { @Override protected 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、源码下载
相关文章推荐
- Quartz学习笔记-Spring整合与简单使用
- Spring--简单使用quartz实现定时作业
- 8.DWR与spring的整合简单使用
- spring Quartz简单整合测试
- quartz的简单使用-基于2.X(二)【与框架的整合】
- Quartz与Spring的整合使用
- Quartz任务调度器及与Spring的整合使用
- Spring--简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- spring整合Quartz实现简单的定时功能
- Spring--简单使用quartz实现定时作业
- spring quartz定时器的简单配置和使用
- Spring--简单使用quartz实现定时作业
- spring整合mybatis(入门级简单教程5)--使用mybatis的API
- Spring -- 简单使用quartz实现定时作业
- 简单3步实现在Spring中使用Quartz
- struts2与spring的整合简单总结和使用
- Spring对Quartz的封装实现简单分析及使用注意事项
- 在使用Spring整合Quartz中,如何关闭不断输出的内容?
- spring 整合quartz的方式——简单介绍