有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承java.util.TimerTask类实现run方法
[java] view plaincopyprint?
import java.util.TimerTask;
public class EmailReportTask extends TimerTask{
@Override
public void run() { }
}
timerTask属性告诉ScheduledTimerTask运行哪个。86400000代表24个小时
启动Spring定时器
Spring的TimerFactoryBean负责启动定时任务
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list><ref bean="scheduleReportTask"/>list>
property>
bean>
scheduledTimerTasks里显示一个需要启动的定时器任务的列表。
可以通过设置delay属性延迟启动
<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="reportTimerTask" />
<property name="period">
<value>86400000value>
property>
<property name="delay">
<value>3600000value>
property>
bean>
这个任务我们只能规定每隔24小时运行一次,无法精确到某时启动
2.Quartz定时器
首先编写服务类:
[java] view plaincopyprint?
<span style="color:#000000;"></span><span style="color:#00ff;">import</span><span style="color:#000000;"> java.util.Date;
</span><span style="color:#00ff;">public</span><span style="color:#000000;"> </span><span style="color:#00ff;">class</span><span style="color:#000000;"> CourseService </span><span id="_72_152_Open_Text"><span style="color:#000000;">{
</span><span style="color:#00ff;">public</span><span style="color:#000000;"> </span><span style="color:#00ff;">void</span><span style="color:#000000;"> start()</span><span id="_96_150_Open_Text"><span style="color:#000000;">{
System.out.println(</span><span style="color:#00ff;">new</span><span style="color:#000000;"> Date().getSeconds());
}</span></span><span style="color:#000000;">
}</span></span><span style="color:#000000;">
</span>
编写调度类,需要继承QuartzJobBean :
package QuartzTest;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class QuartzJob extends QuartzJobBean {
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
courseService.start();
}
private CourseService courseService;
public CourseService getCourseService() {
return courseService;
}
public void setCourseService(CourseService courseService) {
this.courseService = courseService;
}
}
编写配置文件
需要说明的是,我们有两种trigger,分别是simple和cron模式,simple方式和timertask类似,采用设置interval方式进行调度,而cron可以特有的语法很详细的定制调度执行时间,具体描述在配置文件的注释中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<bean id="courseService" class="QuartzTest.CourseService"/>
<!-- 创建调度任务 使用单独编写的调度类QuartzJob -->
<bean id="reportJbo" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>QuartzTest.QuartzJob</value>
</property>
<property name="jobDataAsMap">
<map>
<!--采用jobDataAsMap方式进行courseService注入-->
<entry key="courseService">
<ref bean="courseService"/>
</entry>
</map>
</property>
</bean>
<!-- 创建调度任务 使用已有的service类方法,不需要单独编写调度类QuartzJob
<bean id="reportJbo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="courseService"/>
</property>
<property name="targetMethod">
<value>start</value>
</property>
</bean>
-->
<!-- 配置调度任务,简单模式 -->
<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="reportJbo"/>
</property>
<property name="repeatInterval">
<value>1000</value>
</property>
</bean>
<!-- 配置调度任务,复杂定制模式,月份中的日期和星期不能同时设置 -->
<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="reportJbo"/>
</property>
<property name="cronExpression">
<value>02 20 21 7 6 ? 2007</value>
<!-- 1.秒 0-59
2.分钟 0-59
3.小时 0-23
4.月份中的日期 1-31
5.月份 1-12或者Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec
6.星期中的日期 1-7或者MON,TUE,WED,THU,FRI,SAT,SUN.
-->
</property>
</bean>
<!-- 启动调度 -->
<bean id="start" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronReportTrigger"/>
</list>
</property>
</bean>
</beans>
Spring还为我们提供了更简单的加载调度的方式,也就说我们在已经有业务方法CourseService时不需要再额外编写调度类QuartzJob,可以直接配置service的方法
[java] view plaincopyprint?
<bean id="reportJbo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="courseService"/>
</property>
<property name="targetMethod">
<value>start</value>
</property>
</bean>
<!-- ============== start=============== -->
<bean id="findAppSaveTimeEnd" class="com.skyon.psbc.cas.job.app.FindAppSaveTimeEnd" lazy-init="false" singleton="false" >
<property name="appTaskService" ref="appTaskService"></property>
</bean>
<bean id="findAppTimeEnd" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="findAppSaveTimeEnd"/>
</property>
<property name="targetMethod">
<value>executeJob</value>
</property>
</bean>
<bean id="findAppTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="findAppTimeEnd"/>
</property>
<property name="cronExpression">
<value>0 0 0 * * ?</value>
</property>
</bean>
<!-- ============== end=============== -->
<!-- ===总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序=========== -->
<bean id="startQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="findAppTime"/>
</list>
</property>
</bean>
分享到:
相关推荐
Spring 定时器两种实现方式 Spring 定时器是 Spring 框架中的一种组件,用于实现定时任务的执行。它提供了两种实现方式:Java Timer 定时和 Quartz 定时器。在本文中,我们将详细介绍这两种实现方式的原理、优点和...
在Spring框架中,有两种主要的方法来实现定时任务:Spring自带的`@Scheduled`注解和引入第三方库Quartz。这两种方法都可以帮助开发者在特定的时间点执行任务,为应用程序添加计划任务的能力。 首先,我们来看看使用...
下面将详细介绍这两种实现方式。 ### 1. Java `Timer` 类 Java `java.util.Timer` 类是Java标准库中的一个轻量级定时任务工具。它的使用相对简单,适用于简单的定时任务需求。`Timer` 类包含两个主要的方法:`...
本篇文章将详细探讨两种实现Spring定时任务的方法:基于Java内置的`TimerTask`和第三方库Quartz Scheduler。 首先,让我们看看如何使用`TimerTask`来实现Spring中的定时任务。`TimerTask`是Java的标准库类,它提供...
在Spring框架中,定时任务的实现通常有多种方式,这里主要讨论的是两种常见的方式:Java Timer和Quartz定时器。这两种方法都有其特点和适用场景,开发者可以根据项目需求来选择。 1. **Java Timer定时器** Java ...
在Spring中,AOP的实现主要有两种方式:基于代理的AOP(Proxy-based AOP)和基于字节码的AOP(Bytecode-based AOP)。基于代理的AOP主要使用JDK动态代理或CGLIB库来创建代理对象,而基于字节码的AOP则使用AspectJ库...
Java定时器和Spring定时器是Java开发中用于执行周期性任务的重要工具,它们在系统维护、数据同步、报告生成等场景中发挥着关键作用。本文将深入探讨这两个概念,以及如何在Spring框架中配置和使用定时器。 首先,...
在Java的Spring框架中,定时任务的实现有多种方式,其中两种常见的实现是基于Java的`Timer`类和OpenSymphony的`Quartz`库。这两种定时器在Spring中的使用和配置有所不同,各有优缺点,适合不同的应用场景。 1. **...
本篇文章将详细介绍两种使用Spring自身实现轻量级定时器的方法。 方法一:基于`@Scheduled`注解 1. `@Scheduled`注解:这是Spring提供的一个用于声明周期性任务的注解。在Java类中的方法上添加此注解,Spring会...
在Spring框架中,实现定时任务有两种主流方式:使用`java.util.Timer`类或集成第三方库如Quartz。这两种方法各有优势: - **Java Timer**:简单易用,适合简单的定时任务需求。 - **Quartz**:功能强大且灵活,支持...
Spring定时器基于Java的`java.util.Timer`和`java.util.TimerTask`,但更进一步,它支持Quartz和SimpleScheduler这两种强大的定时任务库。Quartz是一个开源的作业调度框架,而SimpleScheduler则内置在Spring中,适用...
Spring支持两种方式来定义定时任务:一种是使用`@Scheduled`注解,另一种是通过实现`Runnable`接口并注册到`TaskScheduler`。 1. **使用`@Scheduled`注解**: 在你的服务类中,你可以为需要定时执行的方法添加`@...
在提供的压缩包文件中,可能包含了使用上述两种方式实现的项目实例代码,你可以通过这些实例学习如何在不同的Spring版本下配置和使用定时任务。对于初学者来说,理解这些实例有助于深入掌握Spring的定时任务管理,并...
Spring提供了两种主要的定时任务实现方式:`TaskScheduler`和`TaskExecutor`,以及基于Quartz的`SpringIntegration`模块。其中,`TaskScheduler`和`TaskExecutor`适用于简单的定时任务需求,如间隔执行或周期性执行...
本文将详细介绍两种不同的Java获取当前时间的方法,并进一步探讨如何在Spring框架中实现定时任务。 方法一: Java提供了`java.util.Date`和`java.util.Calendar`类来获取当前时间。在示例代码中,首先创建一个`Date...
Spring定时器主要支持两种方式来实现定时任务:基于注解的方式和基于Quartz集成的方式。 #### 二、Spring定时器的实现原理 ##### 2.1 基于注解的定时任务 Spring 3.0引入了`@Scheduled`注解,它可以直接添加到...
Spring提供了两种主要的调度组件:`org.springframework.scheduling.timer.TimerTaskExecutor`(基于Java的`java.util.Timer`)和`org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor`(基于线程池...
本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...
这两种方法都可以有效地在Spring Boot中实现定时任务的功能。第一种方法更为常见,因为它允许你在主类中直接启用定时任务功能;而第二种方法则可以让主类保持简洁,适合那些希望将定时任务与业务逻辑分离的场景。...
首先,Spring提供了两种主要的定时任务解决方案:一是Spring内置的`TaskScheduler`接口,二是基于Quartz库的`@Scheduled`注解。`TaskScheduler`提供了一种异步执行任务的方式,适合于简单的定时任务需求。而`@...