`
heaven.robin
  • 浏览: 30202 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

利用spring的timer和quartz进行任务调度

阅读更多
 jdk提供对timer的支持,timer通过线程不停的将当前时间与服务器时间比较,如时间相同,则执行相应的方法.

class MyJob extends TimerTask{
 public void run() {
  System.out.println("哈哈哈");
 }

在时间相等的情况下,执行timertask的run()方法.

//设置为守护线程

Timer timer = new Timer(true);

//固定时间执行

timer.schedule(new MyJob(), new Date(108,5,31));

//重复时间执行

timer.schedule(new MyJob(), new Date(108,3000,1000));

 

timer提供固定时间执行,和重复时间执行两种调度机制.
 
spring对timer进行封装.
 <bean id="gf2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
 <!-- 延迟时间 -->
  <property name="delay" value="3000"></property>
  <!-- 间隔时间 -->
  <property name="period" value="10000"></property>
  <!-- 任务 -->
  <property name="timerTask">
   <bean class="com.heaven.quartz.MyTask">
    <property name="who" value="女朋友"/>
   </bean>
  </property>
 </bean>
 <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
  <property name="daemon" value="true"/>
  <property name="scheduledTimerTasks">
   <list>
    <ref bean="gf"/>
   </list>
  </property>
 </bean>
显然com.heaven.quartz.MyTask继承TimerTask,只要实现run方法就OK了.
当然,你也可以自己重新对ScheduledTimerTask进行实现.
 
timer只能做到固定时间执行,或者等长间隔时间执行.如果需要在每月15号执行,这是很困难的事,因为每月时间并不是定长的,当然你也可以在timer中加入多个固定时间的任务,但在很多时候并不能符合自己的要求.
 
而quartz解决了这一系列的问题.但你需要quartz.jar这个包,spring带的有.

Scheduler schd = new StdSchedulerFactory().getScheduler();
  schd.start();
  
  JobDetail details =new JobDetail("firstJob",Scheduler.DEFAULT_GROUP,FirstJob.class);
  Map map = details.getJobDataMap();
  map.put("haha", "任务开始....");
  
  //利用cron表达式进行时间的匹配
  String cronExp = "1/3 * 11,12 * * ?";
  Trigger trigger = new CronTrigger("cronTrigger",Scheduler.DEFAULT_GROUP,cronExp);
  
  /*
  
  //当前时间为开始时间结束时间不存在 null 3000间隔
  Trigger trigger = new SimpleTrigger("simpleTrigger",Scheduler.DEFAULT_GROUP,
    new Date(),null,SimpleTrigger.REPEAT_INDEFINITELY,3000);
  
  */
  schd.scheduleJob(details, trigger);

}

 

通过StdSchedulerFactory获得Scheduler,然后实例化JobDetail,这时候需要任务执行类FirstJob,此类继承Job类,并实现excute()方法,类似于timerTask.
public class FirstJob implements Job {
 public void execute(JobExecutionContext context) throws JobExecutionException {
  // TODO 自动生成方法存根
  System.out.println(context.getJobDetail().getJobDataMap().get("haha"));
  System.out.println("下个任务的时间是:"+context.getNextFireTime().toLocaleString());
 }
}
接下来需要做的是,设置其触发器及触发时间了.quartz提供两种触发器,SimpleTrigger和CronTrigger,对我们有用的就是CronTrigger这个触发器了.
它支持cron表达式.
 
Cron表达式的组成.秒 分 小时 日期 月 星期 年
符号:
"*" 任意值,
"?" 无特定值,
"-" 范围,
","列分割符,
"/"增量值,
"L"最后一个,
"#"星期,如2#3,每月第2个星期3
"C*"日期和星期中使用,
如,8/10 3,5 10-12,*,5L,?
每10秒增量,每分钟第8秒,每小时第3,5分钟,每天10-12点,每月,每月的最后一个周4,无固定年份,将激活触发器执行.
 
schd.scheduleJob(details, trigger);
将任务和触发器加入scheduer中.就OK.
 
在spring中的使用:
 

 <!-- job-->
 <bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
  <property name="jobClass" value="com.heaven.quartz.FirstJob"/>
  <property name="jobDataAsMap">
   <map>
    <entry key="haha" value="任务执行"/>
   </map>
  </property>
 </bean>

<!--trigger-->

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="job"/>
  <property name="cronExpression" value="1/3 * 11,12 * * ?"/>
 </bean>

<!--scheduleFactory-->

 <bean id="scheduleFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="cronTrigger"/>
   </list>
  </property>
  <!--<property name="dataSource" ref="ds"/>-->
 </bean>

 

 
Quartz也可以对任务进行持久化,也就是在服务器关闭的时候,将任务持久化到数据库,在服务器再次启动,将重新进行任务的调度.由于不知道其默认的数据表结构,也没去研究它,所有就没搞了.但有需要的化,自己可以根据自己的数据表结果,进行任务持久化的扩展也可以.
 <bean id="ds" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/test"/>
  <property name="username" value="root"/>
  <property name="password" value="root"/>
 </bean>
 
这也只是任务调度的简单的使用,这要根据具体的需要和业务对其进行扩展.比如,个人日程安排等等,定时邮件发送等等.
 
就到这里了 ,谢谢大家.
 
分享到:
评论
1 楼 yzgname 2009-02-25  
不错,学习了。谢谢!

相关推荐

    spring timer、quartz俩种任务调度

    Spring框架提供了对定时任务的强大支持,包括内置的`Spring Timer`和集成第三方的`Quartz Scheduler`。这两种方式都允许开发者灵活地安排和执行周期性任务。下面我们将深入探讨这两种任务调度器及其在Spring中的使用...

    Spring 使用Timer quartz区别

    `Timer` 的工作原理是通过创建一个后台线程,当设定的时间到达时,它会调度任务进行执行。然而,`Timer` 有一些限制,比如它不支持并发任务执行,如果一个任务执行时间过长,会影响到其他任务的调度。此外,`Timer` ...

    Spring的定时任务开发及对Quartz和Timer支持

    在【标题】"Spring的定时任务开发及对Quartz和Timer支持"中,涉及到的是Spring在处理定时任务方面的特性,这在企业级应用中非常常见,用于执行一些周期性的后台任务,如数据同步、报表生成、清理任务等。 首先,...

    spring3.0+quartz-1.6.0定时

    总结起来,"spring3.0+quartz-1.6.0定时"的实现涉及到Spring框架的定时任务支持和Quartz库的结合使用,通过Spring的配置管理Quartz调度器,定义任务和触发器,最后编写具体任务逻辑的Java类。这种组合在实际项目中...

    Spring的quartz和Timer实现定时

    `TimerTask`代表具体的任务,而`Timer`负责调度任务。但`Timer`有一些限制,比如它不是线程安全的,且只有一个线程执行所有任务,这意味着如果一个任务执行时间过长,其他任务将被阻塞。 以下是一个`Timer`的简单...

    spring-timer-quartz.zip_namegnd_spring定时任务

    Spring框架提供了强大的定时任务支持,可以方便地与Spring MVC进行集成,实现灵活的定时任务调度。本文将详细介绍如何使用Spring整合Quartz库来创建和管理定时任务。 首先,Spring对定时任务的支持主要通过`org....

    Spring 框架自带定时任务和Quartz定时任务

    Quartz不仅可以调度单个任务,还可以构建一个集群的调度环境,并且可以与数据库交互,支持监听器、插件和集群功能,适合大型分布式系统和需要高可用性的场景。 Quartz还提供了更为复杂的调度表达式,可以精确地定义...

    spring任务调度实例

    总的来说,Spring任务调度实例提供了实践Quartz和Timer的机会,这对于学习和掌握Spring框架的高级特性和任务调度机制非常有价值。通过学习这个实例,开发者不仅可以提升自己的技能,还能了解到如何在实际项目中选择...

    Quartz--JAVA定时任务\Java应用:Java调度任务和Spring Quartz (1)

    Quartz还支持集群和持久化,这意味着多个Quartz实例可以在分布式环境中协作调度任务,而且任务的状态和计划可以存储在数据库中,保证了高可用性和容错性。通过Spring与Quartz的整合,可以轻松地在Spring应用中管理...

    Sring最佳实践-集成任务调度服务

    本实践主要涉及Spring集成两种常见的任务调度库:Spring的Timer和Quartz。这两者都允许开发者在预定义的时间间隔内执行任务,极大地提高了应用的灵活性和效率。下面将详细介绍这两个任务调度工具及其在Spring中的...

    spring quartz相关jar包(多版本)

    2. `spring-context-support.jar`: 提供对任务调度的支持,包括 Quartz 和 JDK 的 Timer。 3. `spring-aop.jar`: 实现 AOP 功能,可以用来定义切面和通知,适用于事务管理等。 4. `quartz.jar`: Quartz 框架的核心库...

    Spring整合Quartz后的简单定时任务示例

    总结来说,这个资源为你提供了一个基础的Spring与Quartz集成案例,通过学习和实践,你可以掌握如何在Spring环境中利用Quartz实现高效、灵活的定时任务管理。同时,它也鼓励开发者之间的分享和交流,共同提升技术能力...

    Java关于时间调度的几种实现方(Timer Quartz Spring)

    `java.util.Timer` 类提供了一个调度任务的方法,而`TimerTask` 是一个抽象类,用于定义要在特定时间执行的任务。以下是如何使用它们的基本示例: ```java import java.util.Timer; import java.util.TimerTask; ...

    spring2.0 job Quartz 和Time一样的定时任务

    这样,你可以利用Quartz的强大功能,同时享受Spring的依赖注入和管理优势。 比较Spring 2.0的`Job`和Quartz,我们可以总结以下几点差异: 1. 灵活性:Quartz提供了更丰富的定时策略,如CRON表达式,而Spring 2.0的...

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听...

    Spring 任务调度

    Quartz允许创建复杂的调度策略,如按日期、时间间隔或者依赖关系来调度任务。 3. **JDK Timer的使用**: - **TimerTask的实现**:自定义`TimerTask`子类,重写`run`方法以定义任务内容。例如,`MyTask`类会根据...

    Spring的 Scheduled任务调度.docx

    Spring 提供了多种定时任务的实现方式,包括 Java 自带的 Timer、Quartz 和 Spring 自己的 Scheduled 任务调度。在 Spring Boot 中,Scheduled 任务调度变得更加简单易用。 `@Scheduled` 是 Spring 提供的一个注解...

    运用Spring框架实现简单调度

    如quartz、jcrontab、JobServer等,在这里我介绍一种比较简单的调度,没有quartz那么复杂,目的在于实用就行,这种调度就是spring提供的调度功能,该调度功能基于quartz+AOP进行实现,我们开始一个例子吧。

    java中spring与Quartz 整合定时任务.docx

    在Java开发中,Spring框架和Quartz库的整合是实现定时任务的常见方法。Spring提供了对Quartz的集成,使得我们可以...这种整合方式既保留了Quartz的强大功能,又利用了Spring的IoC和AOP特性,简化了任务的配置和管理。

Global site tag (gtag.js) - Google Analytics