Java 定时任务 与 Spring定时任务

来源:互联网 发布:怎么卸载mac软件 编辑:程序博客网 时间:2024/04/29 18:39

平时我们开发中难免会用到定时任务 ,其实定时任务是比较简单的, 下面来简单的介绍下各种各样的定时任务工具

一.定时器任务的分类

1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行. 一般用的较少.

2.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂

3.Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多


二.触发器的分类:
1.每隔指定时间则触发一次 (每隔一段时间执行一次),在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
2.每到指定时间则触发一次 (到某一个时间点执行),在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean

注:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。


三.具体的使用

1.java.util.Timer类

package comz.autoupdatefile;   import java.util.Timer;  import java.util.TimerTask;  public class M {      public static void main(String[] args) {          Timer timer = new Timer();         // 这任务是1秒钟以后执行 , 每两秒执行一次        // 可以不加1秒的参数直接 , 每两秒执行一次        // timer.schedule(new MyTask(),2000);        timer.schedule(new MyTask(), 1000, 2000);      }  } // 需要继承自TimerTask class MyTask extends TimerTask {     @Override      public void run() {          System.out.println("dddd");      }  }  

Timter其实是继承自Runable接口的 , 相当于启动一个线程 ,sleep相应的时间 , 在执行.

2.Quartz

Quartz的定时任务有两种配置: 一种需要继承org.springframework.scheduling.quartz.QuartzJobBean。,第二种无需继续任何类

第一种:继承org.springframework.scheduling.quartz.QuartzJobBean

第一步:编写实现类

import org.quartz.JobExecutionContext;  import org.quartz.JobExecutionException;  import org.springframework.scheduling.quartz.QuartzJobBean;  // 需要继承QuartzJobBeanpublic class JobTask extends QuartzJobBean {  /** * 要调度的具体任务 */  @Override  protected void executeInternal(JobExecutionContext context)  throws JobExecutionException {              System.out.println("定时任务执行中…");        }  }  

第二步:spring配置文件中配置作业类JobDetailBean

<bean name="JobTask" class="org.springframework.scheduling.quartz.JobDetailBean">        /** org.springframework.scheduling.quartz.JobDetailBean有两个属性,       *  jobClass属性即我们在java代码中定义的任务类,       *  jobDataAsMap属性即该任务类中需要注入的属性值(也就是具体要执行的方法)。       */     <property name="jobClass" value="com.xinzhifu.JobTask" />       <property name="jobDataAsMap">  </property>  </bean>  

第三步:配置作业调度的触发方式(触发器)
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。

SimpleTriggerBean:

<bean id="simpleTrigger"     class="org.springframework.scheduling.quartz.SimpleTriggerBean">      <property name="jobDetail" ref="JobTask" />      <property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->      <property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->  </bean> 

CronTriggerBean:

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">      <property name="jobDetail" ref="JobTask" />      <!—每天12:00运行一次 -->      <property name="cronExpression" value="0 0 12 * * ?" />  </bean>  

第四步:配置调度工厂

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">       <property name="triggers">          <list>              <ref bean="cronTrigger" />  // 应用的调度方式        </list>       </property>       // 配置定时任务的相关属性     <property name="quartzProperties">        <props>            <prop key="org.quartz.threadPool.threadCount">5</prop>        </props>     </property></bean> 

第二种不继承特定基类

Spring能够支持这种方式,归功于两个类:
1.org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean

2.org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

这两个类分别对应spring支持的两种实现任务调度的方式,即前文提到到java自带的timer task方式和Quartz方式。这里我只写MethodInvokingJobDetailFactoryBean的用法,使用该类的好处是,我们的任务类不再需要继承自任何类,而是普通的pojo。

第一步:

public class Job2 {     public void doJob2() {          System.out.println("不继承QuartzJobBean方式-调度进行中...");     }  }  

第二步:spring配置类

<bean id="job2"  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">     <property name="targetObject">         <!--targetObject配置具体的实现类 -->         <bean class="com.xinzhifu.Job2" />     </property>    <!-- targetMethod这个是实现类中具体执行的的哪个方法 , value是我们自定义的方法名 -->     <property name="targetMethod" value="doJob2" />     <property name="concurrent" value="false" /><!-- 作业不并发调度 -->  </bean>  

第三步与第一种的相同

第四步与第一种的相同

3.Spring-Task

第一种注解的方式

第一步: 实现类的编写

@Component //这个注解是将这个类实例化到spring容器中public class TestTask {    // Scheduled是定时任务的规则    @Scheduled(cron = "0/5 * * * * ?")    public void print(){        String time = DateFormat.getDateTimeInstance().format(new Date());        System.out.println("定时器触发打印"+time);    }}

第二步:spring配置文件

<!-- beans 添加     xmlns:task="http://www.springframework.org/schema/task"    http://www.springframework.org/schema/task    http://www.springframework.org/schema/task/spring-task-3.0.xsd"-->    <!-- 注解方式开启 -->    <context:annotation-config />    <context:component-scan base-package="com.xinzhifu.task" />    <task:annotation-driven/>

这里就完成了 , 注解的方式相对来说是很简单的 ,节省不少的代码

第二种: 配置文件

第一步:实现类

import org.springframework.stereotype.Service;  @Service  public class TaskJob {      public void job1() {          System.out.println(“任务进行中。。。”);      }  }  

第二步:在spring配置文件头中添加命名空间及描述

<!-- beans 添加     xmlns:task="http://www.springframework.org/schema/task"    http://www.springframework.org/schema/task    http://www.springframework.org/schema/task/spring-task-3.0.xsd"-->

第三步:spring配置文件中设置具体的任务

<task:scheduled-tasks>           <task:scheduled ref="taskJob" method="job1" cron="0 * * * * ?"/>   </task:scheduled-tasks>  <context:component-scan base-package=" com.xinzhifu.mytask " />  

这些基本上选取一种就ok , 其实相对来说还是比较简单的

定时任务的规则
http://blog.csdn.net/chentravelling/article/details/45949625

http://blog.csdn.net/imzoer/article/details/8500670

http://gong1208.iteye.com/blog/1773177

1 0
原创粉丝点击