项目中要用到定时调度的功能,使用的是quartz,使用中遇到了一些问题,特地记下来。
一、quartz概述
quartz是一个任务定时调度的框架,支持定时的调用特定的方法,支持与Spring的整合。
二、配置步骤
quartz与Spring整合,需要一个配置文件来管理quartz中的类。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<!-- 实际的工作Bean -->
<bean id="workBean" class="WorkClass">
</bean>
<!-- jobBean用于设定启动时运用的Bean与方法 -->
<bean id="scheduledReportJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="workBean" />
</property>
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<!-- 每5秒启动一次 -->
<bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="scheduledReportJobDetail" />
</property>
<property name="cronExpression">
<value> 0/5 * * * * ?</value>
</property>
</bean>
<!-- 起动Bean -->
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="trigger" />
</list>
</property>
</bean>
</beans>
配置文件中配置的几个bean,依次代表,实际工作的bean、封装后用于调度的bean、配置有时间间隔的trigger触发器bean和用于启动任务的主类工厂bean。
这样,创建自己的调度就变得非常简单,我们只需要完成自己的工作方法,在xml中配置好,并制定一个时间间隔,然后启动主类就可以了。
public class WorkClass {
public void work() {
System.out.println("hello world");
}
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("scheduleTask.xml"));
System.out.println(factory.getBean("scheduler"));
}
}
当然,除了和Spring整合之外,Quartz也可以单独用。
同Spring中的工作类不一样,不用Spring的工作类需要继承Job接口。
public class TestWithoutSpring implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("work");
}
}
而触发器和调度者的信息则需要在调用处指定。
public void testWork() {
JobDetail jobDetail = new JobDetail();
jobDetail.setJobClass(TestWithoutSpring.class);
jobDetail.setName("asdf");
CronTrigger trigger = new CronTrigger();
trigger.setName("test");
String expression = "2-3 0/1 * * * ?";
Scheduler scheduler = null;
try {
trigger.setCronExpression(expression);
SchedulerFactory sf = new StdSchedulerFactory();
scheduler = sf.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (ParseException e) {
e.printStackTrace();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
启动以后就和使用Spring管理是一样的效果了。
三、时间间隔配置
在触发器bean中有一个重要的属性叫cronExpression,这个是代表调度频率,也就是时间间隔的,这里有特殊的格式。
quartz中的时间格式有7个元素组成,分别为秒、分、时、日、月、周几、年(可选),反应在配置中就是7(6)个由空格分隔的字符。
秒 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 , - * /
这里常规的配置就是直接输入数字,但是quartz允许我们使用更加泛化的配置,所以提供了一些通配符。
* 表示用于替代任意数字
/表示增加幅度, 5/10表示从5开始,每10执行一次
-表示一个区间范围
? 在日和周几中出现,这里是用来明确界定,以免产生歧义
如cronExpression配置为 0/5 * * * * * 时会报错:Support for specifying both a day-of-week AND a day-of-month parameter is not implemented, 这就是日和周几产生了冲突, 改为 0/5 * * * * ? 就可以了,表示每5秒执行一次任务。
P.S quartz一开始是没有和Spring做整合的而且随着版本的迭代个中的类有一些变化, 这里就要注意quartz和Spring的版本匹配问题。
四、深入
Spring管理的quartz类变得很抽象,实际上,quar中有几个核心的类。
Job接口,实现了Job接口的类是任务中的实际工作类,对应于workBean
JobDetail类,包装Job,对应于scheduledReportJobDetail,利用反射在实际的调度中执行特定的方法
Trigger类,这是触发器类,用于封装调度频率时间间隔的逻辑,对应于trigger
Scheduler类,这是调度类,是封装了整个调度逻辑的最高层抽象,它持有代表任务的JobDetail类和代表调度频率的Trigger类,是调度逻辑的执行者和管理者。
了解了主要的类,要执行管理就很简单了,比如要控制调度的暂停或者关闭,只要通过Spring拿到对应的Scheduler类,调用其方法就可以了
分享到:
相关推荐
5. **监控与管理**:为了更好地管理和监控定时任务,可以利用Quartz提供的JMX支持,或者使用第三方的监控工具,如Spring Boot Actuator,实时查看任务状态和执行情况。 6. **心得分享**:在实践中,要注意任务的...
也许大多数人听说 Quartz 是在学习或使用 Spring 的时候,也就是 Spring 整合了 Quartz。而我也不例外,同样是在春天里得悉了这块石英。 当初公司一个项目中有些定时候任务,原来是用 JDK 的 TaskTimer 来实现的,...
### Springside之开发bookstore心得 #### BookStore项目概述 BookStore是一个基于Spring框架构建的典型B2C网上书店应用程序,旨在演示各种企业级应用技术。由于该项目的主要目的是技术演示而非实际商业运营,因此...
Quartz是Java开源的调度框架,用于定时任务的执行。Middlegen是一个数据库建模工具,能自动生成Java持久层代码。Synchronizer可能是用来同步数据的工具,确保数据一致性。HSQLDB是一个轻量级的开源数据库,常用于...
### DirectShow下载安装配置心得 #### 一、DirectShow简介及下载 DirectShow是Microsoft Windows操作系统中的一个多媒体框架,主要用于处理音频和视频流。它基于COM(Component Object Model)技术,能够实现各种...
Gradle是一种更先进的构建自动化工具,它允许开发者使用Groovy或Kotlin DSL编写构建脚本,具有高度可定制性和灵活性。 10. **Apache Tomcat**: Tomcat是一个开源的Servlet容器,实现了Java Servlet和JavaServer ...
30、**定时任务**:使用Quartz等工具设置定时任务,自动化执行周期性任务。 31、**流程表单**:设计和实现与流程相关的业务表单,如审批表单。 32、**绘制流程图**:使用Flowable提供的工具或第三方软件绘制流程图...
这个文本文件可能讲解了如何在Spring中配置和使用Quartz或Spring的TaskScheduler接口来实现定时任务,以及在JBoss环境下如何管理和调度这些任务。 3. "使用web.xml方式加载Spring.txt" - 这个文件可能详细阐述了...
这种效果在iOS设备上广泛应用于电子书阅读器、杂志应用和其他具有页面翻动体验的软件中,给用户带来更加生动和真实的交互感受。 源代码的核心技术在于利用了Quartz 2D图形库和Core Animation框架。Quartz 2D是苹果...
spring-boot-example spring boot 相关实例,不断更新,欢迎点亮 Demo项目名称 含义 博客介绍 整合Apollo应用配置中心 Aop 整合阿里云Acm应用配置中心 ...关注程序员小强公众号更多编程趣事,知识心得与您分享
它集成了大量常用的第三方库配置,如 JDBC、MongoDB、RabbitMQ、Quartz 等,大大减少了项目初始化时的工作量。通过“约定优于配置”的原则,Spring Boot 可以帮助开发者快速构建出高质量的应用程序。 二、在线学习...
- 问题解决的过程与心得。 - 技术选型的原因。 - **面试考察要点:** - 如何全面而深入地理解项目。 - 如何应对复杂的业务需求。 通过以上总结,可以看出《Java最新面试宝典》覆盖了Java开发人员面试中可能遇到...
AFKPageFlipper的实现基于iOS的Quartz 2D和Core Animation框架,这些底层技术为实现流畅、高性能的动画提供了坚实的基础。开发者可以通过调整参数,如翻页速度、角度、阴影效果等,来定制符合项目需求的翻页样式。...
这个系统旨在提供一个便捷、高效的平台,让学生可以分享自己的读书心得,同时也能查阅他人的笔记,促进知识的传播和学习的互助。 1. **Springboot核心概念**: - Springboot是Spring框架的扩展,旨在简化Spring...
在iOS开发中,图形与动画处理是至关重要的组成部分,它们为用户提供了丰富的视觉体验和流畅的操作感受。在本文中,我们将深入探讨标题“ios图形动画处理”所涵盖的知识点,包括UIFont、UIImage、UIColor等核心绘图类...
"惊喜的-冬天雪花特效"这个项目,显然就是一款旨在为用户带来冬季氛围的软件应用,它通过在桌面上模拟真实的雪花飘落效果,使得用户在室内也能感受到冬日的浪漫与宁静。 这个特效的实现涉及到多个技术层面。首先,...
SpringBoot集成了众多第三方库,如数据存储(Redis、MongoDB)、消息队列(RabbitMQ)、任务调度(Quartz)等,使得开发者可以快速启动并运行应用,无需繁琐的配置。 SpringBoot的主要优点包括: 1. **快速入门**...
用户之间相互解答,分享产品使用心得,只向用户推送自己关心的消息,扩大价值,压缩干扰。 > 使用说明:请保留页面底部的 *powered by 28844. com* 感谢支持 在线地址: [28844.com](http://www.28844.com) | ...
在IT行业中,直角翻页效果是一种常见的用户体验设计,它主要应用于电子书阅读器、PDF阅读软件以及网页设计中,为用户提供类似纸质书籍翻页的视觉感受。这种效果增加了数字内容的互动性和沉浸感,使得用户在阅读电子...