最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现。对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考。
我使用的是Maven来管理项目,需要的Jar包我给大家贴出来。
quartz-1.8.5.jar
commons-logging.jar
spring-core-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring.transaction-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
Maven的pom.xml的配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>QtzTest</groupId>
- <artifactId>QtzTest</artifactId>
- <version>1.0</version>
- <properties>
- <springframework.version>3.0.5.RELEASE</springframework.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${springframework.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context-support</artifactId>
- <version>${springframework.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>${springframework.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- <version>${springframework.version}</version>
- </dependency>
- <dependency>
- <groupId>org.quartz-scheduler</groupId>
- <artifactId>quartz</artifactId>
- <version>1.8.5</version>
- </dependency>
- </dependencies>
- <build>
- <finalName>${project.artifactId}</finalName>
- <plugins>
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- <version>7.5.4.v20111024</version>
- <configuration>
- <scanIntervalSeconds>10</scanIntervalSeconds>
- <webApp>
- <contextPath>/${project.artifactId}</contextPath>
- </webApp>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </project>
特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2.1.3的,怎么搞都报错:
Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'mytrigger' defined in class path resource [applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class
查看发现spring3.0.5中 org.springframework.scheduling.quartz.CronTriggerBean继承了 org.quartz.CronTrigger(public class CronTriggerBeanextends CronTrigger),而在quartz2.1.3中org.quartz.CronTrigger是个接口(publicabstract interface CronTrigger extends Trigger),而在quartz1.8.5及1.8.4中org.quartz.CronTrigger是个类(publicclass CronTrigger extends Trigger),从而造成无法在applicationContext中配置触发器。这是spring3.1以下版本和quartz2版本不兼容的一个 bug。(感谢tiren的回复,spring3.1以及以后版本支持quartz2)
在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法仍然是普通类。很显然,第二种方式远比第一种方式来的灵活。
第一种方式的JAVA代码:
- package com.ncs.hj;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.scheduling.quartz.QuartzJobBean;
- public class SpringQtz extends QuartzJobBean{
- private static int counter = 0;
- protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
- System.out.println();
- long ms = System.currentTimeMillis();
- System.out.println("\t\t" + new Date(ms));
- System.out.println(ms);
- System.out.println("(" + counter++ + ")");
- String s = (String) context.getMergedJobDataMap().get("service");
- System.out.println(s);
- System.out.println();
- }
- }
第二种方式的JAVA代码:
- package com.ncs.hj;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.scheduling.quartz.QuartzJobBean;
- import java.util.Date;
- public class SpringQtz {
- private static int counter = 0;
- protected void execute() {
- long ms = System.currentTimeMillis();
- System.out.println("\t\t" + new Date(ms));
- System.out.println("(" + counter++ + ")");
- }
- }
Spring的配置文件:
- <!------------ 配置调度程序quartz ,其中配置JobDetail有两种方式-------------->
- <!--方式一:使用JobDetailBean,任务类必须实现Job接口 -->
- <bean id="myjob" class="org.springframework.scheduling.quartz.JobDetailBean">
- <property name="name" value="exampleJob"></property>
- <property name="jobClass" value="com.ncs.hj.SpringQtz"></property>
- <property name="jobDataAsMap">
- <map>
- <entry key="service"><value>simple is the beat</value></entry>
- </map>
- ;/property>
- </bean>
- <!--运行时请将方式一注释掉! -->
- <!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->
- <!-- 定义目标bean和bean中的方法 -->
- <bean id="SpringQtzJob" class="com.ncs.hj.SpringQtz"/>
- <bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject">
- <ref bean="SpringQtzJob"/>
- </property>
- <property name="targetMethod"> <!-- 要执行的方法名称 -->
- <value>execute</value>
- </property>
- </bean>
- <!-- ======================== 调度触发器 ======================== -->
- <bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail" ref="SpringQtzJobMethod"></property>
- <property name="cronExpression" value="0/5 * * * * ?"></property>
- </bean>
- <!-- ======================== 调度工厂 ======================== -->
- <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="triggers">
- <list>
- <ref bean="CronTriggerBean"/>
- </list>
- </property>
- </bean>
关于cronExpression表达式,这里讲解一下:
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
表达式意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
每天早上6点
0 6 * * *
每两个小时
0 */2 * * *
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *
最后别忘了在web.xml里面配置Spring:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/spring-config.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- </web-app>
相关推荐
Spring中Quartz任务调度器cronexpression配置说明
封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询,Spring+Quartz调度,FunctionCharts图像化工具 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。 # 实现原理 @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当...
在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等...使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。
下载导入就可以用,执行test类的main方法加载spring applicationContext.xml配置文件,启动Quartz定时器.修改spring配置文件的配置时间.详细看注释
于是想起了 Spring 框架整合了一个作业调度框架 Quartz,其实一直没用过它,而且这回是 要脱离 Spring 框架来使用 Quartz。于是就到网上找来 Quartz 相关的资料,介绍使用倒也不含糊,但缺乏系统与深度,继而找 到的...
Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的...如果需要使用调用框架,在商业软件和开源软件中已经有很多优秀的企业级调度框架(如 Quartz、Tivoli、Control-M、Cron 等)可以使用。
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,...
Quartz 是什么,大概不需多加说明,简单讲就是一个纯 Java 实现的作业调度工具,相当于数据库中的 Job、Windows 的计划任务、Unix/Linux 下的 Cron,但 Quartz 可以把排程控制的更精细。也许大多数人听说 Quartz 是...
elastic-job和ddframe关系见下图Elastic-Job 主要功能定时任务: 基于成熟的定时任务作业框架Quartz cron表达式执行定时任务。作业注册中心: 基于Zookeeper和其客户端Curator实现的全局作业注册控制中心。用于注册...
基于Quartz的二次封装,URL Request是二次封装的核心,包含基本UrlRequest(method、url、cron、name),UrlResponse(响应日志) UrlRequestPlus by 增强版的UrlPlus部分,将会包含TokenAddition(令牌设置Header ...
强自定义:支持在线配置定时任务请求类型、请求路径、请求参数、Cron表达式,即时生效; 动态控制:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效; 执行策略:支持丰富的执行策略,包括:Get...
java源码排课QuartzSchelarService Spring Boot + Quartz应用 它说明了如何安排cron作业,如何暂停作业,恢复作业,编辑石英作业等。它使用h2作为存储石英作业和触发器的数据库。
比如:使用Spring框架集成quartz,只需要进行一些简单的配置就能定时执行任务了。但是随着企业的系统越来越多、逐步从单一应用慢慢演变为微服务集群。 在分布式集群系统中主要面临出如:任务的重复执行、没有统一定时...
进行任务调度根据设置的cron trigger触发执行转换服务。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,...
10.3 使用quartz进行作业调度 10.3.1 简单的作业 10.3.2 cron作业 10.4 作业实战 10.4.1 修改领域模型 10.4.2 实现控制器 10.4.3 创建视图和模板 10.4.4 作业调度 10.4.5...
有一个支持cron作业的调度程序。 具有Web套接字支持。 支持调度程序中的多个线程 在使用者中支持多个线程。 支持HibernateORM Poist是跨平台 利用Rabbit MQ和Spring AMQP 与Resque,Sidekiq,delayed_job,...
- 一站式支付解决方案,统一下单接口,支持支付宝、微信、网银等多种支付方式。不涉及业务的纯粹的支付平台。 - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统...