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
- Quartz的简单使用和与Spring的整合
- Quartz与Spring的整合使用
- Quartz与Spring的整合使用
- Quartz与Spring的整合使用
- Quartz与Spring的整合使用
- quartz与spring的整合使用
- Quartz与Spring的整合
- spring 与 Quartz的整合
- Quartz与Spring的整合
- Quartz与spring的整合
- quartz(二):quartz和spring的整合
- Quartz任务调度器及与Spring的整合使用
- Quartz任务调度框架和Spring的整合使用
- struts2与spring的整合简单总结和使用
- Spring整合ActiveMQ与Quartz的实例
- Quartz与Spring整合的xml
- Quartz学习笔记-Spring整合与简单使用
- Spring Boot和Quartz的整合
- 工作中遇到的一些javaScript细节(一)
- 快速弹窗工具类
- rapidJson::Document doc
- 选择器本没有什么优先级可言! 只不过叫着叫着就有了而已——关于韩顺平老师将div+css部分选择器的优先级
- linux 下 apache启动、停止、重启命令
- Quartz的简单使用和与Spring的整合
- maven创建scala项目:spark-streaming项目使用
- Array
- Java分布式应用技术架构介绍
- php 使用 ticks declare 进行 耗时记录
- 用软件管工程合同有什么价值?
- 01html的简介
- Extjs动画效果(自定义动画) Ext Core 预置的 12 个动画功能
- springMVC部分注解说明