Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下。
对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任务的业务,另一个就是Cron表达式。定时任务跟具体的业务相关,这无需多说,这里只说明表达式含义及其写法。 Cron表达式包括下面7个字段并区别顺序:秒0-59,分0-59,小时0-23,月内日期1-31,月1-12或者JAN-DEC,周内日期1-7或者SUN-SAT,年(可选字段)留空或者1970-2099并且通过特殊字符表示特殊意义,具体为下: 斜线(/)字符表示增量值。例如,在秒字段中"5/15"代表从第5秒开始,每15秒一次。
问号(?)字符和字母L字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入"?",表示周内日期值无关紧要。这里有个很蛋疼的设定,无关Quartz,而是Spring集成Quartz后,它自己加的一个约束,那就是:日期(1-31)和星期(SUN-SAT)两者,必须有一个是问号(?),系统在启动的时候,Spring会检查表达式,如果不符合它的规则,就会抛异常。所以在使用的时候这个地方一定要注意,而这个在Linux上执行Cron是没有这个限制的。 字母L字符是last的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果"L"单独存在,就等于"7",否则代表当月内周内日期的最后一个实例。所以"0L"表示安排在当月的最后一个星期日执行。
字母(W)字符把执行安排在最靠近指定值的工作日。把"1W"放在月内日期字段中,表示把执行安排在当月的第一个工作日内。 井号(#)字符为给定月份指定具体的工作日实例。把"MON#2"放在周内日期字段中,表示把任务安排在当月的第二个星期一。 星号(*)字符是通配字符,表示该字段可以接受任何可能的值、表达式例子。 例子: "0
0 08 * * ?"每天上午8点触发
"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 2009-2019" 2009年至2019年的每月的最后一个星期五上午10:15触发 "0
15 10 ? * 6#3"每月的第三个星期五上午10:15触发
使用Spring
Quartz实现Job任务有两种方式,一种是继承org.springframework.scheduling.quartz.QuartzJobBean,这个不推荐。另一种不需要继承,只需要在配置文件中定义org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean,并指定它的targetObject属性为Job任务类,targetMethod属性为任务方法就可以了。
<beanid="job"class="
xx.xx.xx.Job"/> <beanid="cronTask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <propertyname="targetObject"ref="job"/> <propertyname="targetMethod"value="runWork"/> <!-- false表示job不会并发执行,默认为true--> <propertyname="concurrent"value="false"/> </bean> targetObject属性指定的任务类,有多种方式实现。 1、可以用@Component注解在类上面标注,这样就不用定义<beanid="job"
.../>这些东西了。 2、可以按上面的写法来配置。 3、直接使用下面的写法。 <propertyname="targetObject"> <beanclass="xx.xx.xx.Job"/> </property> 接下来配置触发器 <beanid="doWork"class="org.springframework.scheduling.quartz.CronTriggerBean"> <propertyname="jobDetail"ref="cronTask"/> <!—每天凌晨0点1分执行--> <propertyname="cronExpression"value="0
01 00 * * ?"/> </bean> 最后配置调度工厂 <beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propertyname="triggers">
<list>
<reflocal="doWork"/>
</list> </property> </bean> 到此,整个配置就完成了。下面再看看Spring-Task实现定时任务的步骤。 Spring从3.0开始增加了自己的任务调度器,它是通过扩展java.util.concurrent包下面的类来实现的,它也使用Cron表达式。 使用spring
task非常简单,首先增加命名空间schema <beansxmlns="http://www.springframework.org/schema/beans" ...... xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation=" ...... http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 然后给定时任务类添加@Component注解,给任务方法添加@Scheduled(cron
="0/5 * * * * ?")注解,并让Spring扫描到该类。 然后加上<task:annotation-driven
/>这个配置,让Spring识别@Scheduled注解(org.springframework.scheduling.annotation.Scheduled)。 OK,设置完成。如果还想扩展一下,改成下面这样: <task:executorid="executor"pool-size="5"/> <task:schedulerid="scheduler"pool-size="5"/> <task:annotation-drivenexecutor="executor"scheduler="scheduler"/> 如果定时任务很多,可以配置executor线程池,这里executor的含义和java.util.concurrent.Executor是一样的,pool-size的大小官方推荐为5~10。scheduler的pool-size是ScheduledExecutorService线程池,默认为1。假如我设置了8个任务,每个任务都是每5秒钟执行一次,把下面的代码再复制7份再改一改,看看打印结果。 @Scheduled(cron
="0/5 * * * * ?") publicvoidwork1(){ System.out.println(Thread.currentThread().getName()+"
"+"work1:每5秒执行一次"); } 定时任务执行了3次,我们可以看到,线程名称都是以scheduler为前缀,这是因为我们已经在<task:schedulerid="scheduler"pool-size="5"/>这段配置里定义了id为scheduler的结果,它就是用来作为任务线程的前缀,再交给executor线程池进行。 3次任务执行,因为我们设定的任务调度线程池大小为5,所以,只有5个实例来处理这8个任务,从结果可以看出来,不是每次都会用上全部的5个实例。如果你系统中的定时任务过多,这个pool-size的大小就应该调大一点,方便之前定义的executor线程池来执行。
本篇转载自:http://www.blogjava.net/bolo
分享到:
相关推荐
总结来说,Spring的`spring-task`适合简单定时任务,而Quartz更适合复杂场景。通过注解方式配置定时任务简洁明了,适用于快速开发;非注解方式则提供了更大的灵活性,可以满足更多定制化需求。结合提供的文档和源码...
springtask 和 quartz +ssh简单示例springtask 和 quartz +ssh简单示例springtask 和 quartz +ssh简单示例springtask 和 quartz +ssh简单示例
Quartz是Java领域的一款功能强大的作业调度库,而Spring通过其优秀的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)特性,将Quartz与应用程序的其他部分无缝连接,提供...
另外,Spring的`TaskScheduler`也可以与Quartz结合使用,提供更灵活的控制。 总结,通过上述步骤,我们已经成功地使用Spring注解配置了Quartz2.2.1,实现了基于注解的任务调度。这种方式简化了配置,使得任务管理和...
Spring通过其优秀的依赖注入(DI)和AOP(面向切面编程)特性,与Quartz相结合,简化了定时任务的配置和管理。下面我们将深入探讨如何利用Spring注解实现Quartz定时执行功能。 首先,我们需要引入Quartz和Spring的...
本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...
4. **定义任务(Job)**:在Spring中,任务通常由实现了`org.springframework.core.task.TaskExecutor`接口的类或者实现了`org.quartz.Job`接口的类来定义。你可以使用`@Component`注解将任务类注册为Spring Bean。 ...
Spring整合Quartz Job以及Spring Task的实现方法 Spring Framework是Java开发中最流行的框架之一,它提供了许多强大的功能来帮助开发者快速构建企业级应用程序。在企业级应用程序中,定时任务是一个非常重要的组件...
【Spring Task与Quartz:构建高效任务调度系统】 在Java后端开发中,有时我们需要执行定时任务,例如定期清理缓存、发送邮件或者执行数据同步等。Spring框架为我们提供了两种强大的定时任务解决方案:Spring Task...
本项目来源与网络,本人对项目...直接通过mvn 倒入项目,在Spring-quartz-demo\src\main\webapp\sql 有sql 建立数据库,表 启动tomcat 直接访问http://localhost:8080/Spring-quartz-demo/task/taskList.htm 就可以使用
总结来说,Quartz适合需要高度定制和复杂调度逻辑的场景,而Spring Task则适用于简单、快速集成定时任务的需求。在选择时,可以根据项目的具体需求和对复杂性的接受程度来决定使用哪一种。对于不希望作业类继承特定...
Spring和Quartz的集成使得我们可以方便地将定时任务与应用的其他部分无缝连接。Quartz的灵活性和强大功能,配合Spring的便利性,使得开发者可以轻松地创建和管理定时任务,实现如数据同步、日志清理、报表生成等各种...
2. 管理任务:可以通过 Spring 的 `TaskScheduler` 或 `ThreadPoolTaskScheduler` 来管理任务,或者直接使用 Quartz 提供的 API 进行操作,如暂停、恢复、删除任务。 通过上述步骤,你可以实现基于 Spring 的 ...
总结来说,Spring与Quartz的整合可以提供强大且灵活的定时任务功能。在集群环境中,通过合理配置和设计,可以实现高可用和可扩展的定时任务系统。理解并掌握这些知识点,将有助于构建高效的企业级应用。
"定时框架spring+quartz"的结合,就是将Quartz的定时功能与Spring的强大集成能力完美融合,为开发者提供了一种高效、灵活的定时任务解决方案。 Spring框架提供了多种方式来管理定时任务,包括使用Spring的`@...
**Spring Task 深度解析与实战应用** Spring Task,也称为Spring的内置任务调度框架,是Spring Framework的一部分,它提供了在Spring应用中定义和执行定时任务的能力。这个功能强大的工具使得开发者无需依赖外部...
3. **定义Job**:创建实现`org.springframework.core.task.TaskExecutor`接口的类,或者直接使用`org.springframework.scheduling.quartz.JobDetailBean`,来定义具体的任务逻辑。 4. **配置Trigger**:创建一个...
<bean id="jobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <value>work <!-- 定义触发时间 --> <bean id="doTime" class="org.springframework....
总结来说,Java时间调度提供了多种选择,从基础的`Timer`和`TimerTask`到更高级的Quartz和Spring。选择哪种方式取决于项目需求的复杂性和对功能的需求。对于简单的定时任务,`Timer` 和 `TimerTask` 可能已经足够;...