当前位置:编程学习 > JAVA >>

spring 定时任务(1)

网络版转载1:
 
定义一个任务是很简单的实现TimerTask的run方法就可以了.
如下:Task.java
 package test.timerTask;
 
import java.util.TimerTask;
 
  public class Task extends TimerTask {
       @Override
       publicvoid run() {
             System.out.println("测试TimerTask : Hello !!");
         }
}
 
Task2.java
 package test.springTimer;
 
  import java.util.TimerTask;
 
 public class Task2 extends TimerTask{
  public void run(){
        System.out.println("task2 isrunning");
    }
}
 
然后是配置文件:
 
 <?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE beansPUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<beanid="sayHelloTask"class="test.springTimer.Task"></bean>
<beanid="HelloTask"class="test.springTimer.Task2"></bean>
<beanid="scheduledTask"class="org.springframework.scheduling.timer.ScheduledTimerTask">
<propertyname="timerTask"><refbean="sayHelloTask"/></property>
<!-- 任务执行周期 2m 关于一些任务的参数请参考JDK doc文档和Spring相关文档-->
<propertyname="period"><value>2000</value></property>
<!-- 延时1s 执行任务 -->
<propertyname="delay"><value>1000</value></property>
</bean>
 
<beanid="scheduledTask2"class="org.springframework.scheduling.timer.ScheduledTimerTask">
<propertyname="timerTask"><refbean="HelloTask"/></property>
<!-- 任务执行周期 2m 关于一些任务的参数请参考JDK doc文档和Spring相关文档-->
<propertyname="period"><value>2000</value></property>
<!-- 延时1m 执行任务 -->
<propertyname="delay"><value>1000</value></property>
</bean>
 
<!-- 启动定时器 -->
<bean id="timerBean"class="org.springframework.scheduling.timer.TimerFactoryBean">
<propertyname="scheduledTimerTasks">
<list><refbean="scheduledTask"/><refbean="scheduledTask2"/></list>
</property>
</bean>
</beans>
 
 
测试类如下:TestApp.java
 package test.timerTask;
 
 importorg.springframework.context.ApplicationContext;
 importorg.springframework.context.support.ClassPathXmlApplicationContext;
 
public classTestApp {
 
        publicstatic void main(String[] args) {
     ApplicationContextcontext = newClassPathXmlApplicationContext("test/timerTask/javaTimer.xml");                                                           
 // ApplicationContext context2 = newClassPathXmlApplicationContext("test/timerTask/quartzTimer.xml");  }
// 只要加载配置文件就可以了,
}
 
运行结果:
task2 is running
task2 is running
haha,task isrunning
haha,task isrunning
task2 is running
 
使用Java中的定时器比较简单,其提供的任务也比较简单,下面来看看使用quartz来执行一个复杂的任务.
SayHelloTaskUsingQuartz.java
 package test.timerTask;
 
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 importorg.springframework.scheduling.quartz.QuartzJobBean;
 
 public class SayHelloTaskUsingQuartz extendsQuartzJobBean {
 
  @Override
  protected void executeInternal(JobExecutionContextcontext)throws JobExecutionException {
    System.out.println("使用Quartz 认为调度: Hello!!");
  }
}
 
 
配置文件:
 <?xml version="1.0"encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING//DTDBEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 <bean id="sayHelloJob"class="org.springframework.scheduling.quartz.JobDetailBean">
 <property name="jobClass">
<value>test.timerTask.SayHelloTaskUsingQuartz</value>
 </property>
 </bean>
 
 <!-- 关键在如下两个触发器的配置 -->
 
 <!-- 类似于Java的简单触发器-->
 <bean id="helloTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<propertyname="jobDetail"><ref bean="sayHelloJob"/></property>
<property name="startDelay"><value>1000</value></property>
<propertyname="repeatInterval"><value>3000</value></property>
 </bean>
    
 <!-- 复杂触发器 -->
 
 <bean id="helloCronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">
 <property name="jobDetail"><ref bean="sayHelloJob"/></property>
 <property name="cronExpression"><!-- 关键在配置此表达式-->
 <value>0 49 15 * *  </value>
 </property>
 </bean>
 <bean id="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="triggers"><refbean="helloCronTrigger"/></property>
 </bean>
</beans>
 
关于简单触发器和复杂触发器,查考下面的解释:
Quartz设计者做了一个设计选择来从调度分离开作业。Quartz中的触发器用来告诉调度程序作业什么时候触发。框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。SimpleTrigger为需要简单打火调度而设计。典型地,如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。另一方面,如果你有许多复杂的作业调度,那么或许需要CronTrigger。CronTrigger是基于Calendar-like调度的。当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger。正如它的名字所暗示的那样,CronTrigger是基于Unix克隆表达式的。
下面的Quartz克隆表达式将在星期一到星期五的每天上午10点15分执行一个作业:0 1510   * MON-FRI
下面的表达式:0 15 10  * 6L 2002-2005 将在2002年到2005年
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,