您的位置:首页 > 编程语言 > Java开发

J2EE中使用Spring集成quartz计划任务

2012-04-03 15:26 507 查看
Spring提供了对quartz的集成,这样在j2ee的应用中,可以很方便的实现我们的任务计划,比如:你可以设定每天半夜的时候,来实现备份数据库,记录日志,因为这个时候web的压力相对比较小。也可以用来定时的发EMAIL等。

1、Spring中集成quartz 首先需要在web.xml 中配置个quartz的监听器。这样,随着WEB程序的启动,会自动启动quartz的调度配置。

Web.xml 中加入 监听器:

<listener> 

<listener-class>com.yangxinyong.quartz.listener.QuartzServiceLoader</listener-class>  

 </listener>

2、QuartzServiceLoader 实现了 javax.servlet.ServletContextListener  ,里面有两个方法。

QuartzServiceLoader类:

Java代码
 

public class QuartzServiceLoader implements ServletContextListener {  
  
    public void contextDestroyed(ServletContextEvent arg0) {             
        try {     
                //监听器关闭时关闭Sheduler  
  
         JobListener.stop();     
        } catch (Exception ex) {     
            System.out.println(ex.getMessage());     
        }     
         
    }     
    
    public void contextInitialized(ServletContextEvent arg0) {     
        try {    //监听器启动时启动Sheduler   
  
         JobListener.run();     
        } catch (Exception ex) {     
            System.out.println(ex.getMessage());     
        }     
    }     
    
}    

 

3、此时,我们要新建个 JobListener 类 ,来读取配置文件applicationContext-quartz.xml,启动quartz的计划任务配置,以及关闭监听时的关闭quartz的操作。

Java代码
 

package com.yangxinyong.quartz.listener;   
  
import org.quartz.Scheduler;   
import org.quartz.impl.StdSchedulerFactory;   
import org.springframework.beans.factory.xml.XmlBeanFactory;   
import org.springframework.core.io.ClassPathResource;   
import org.springframework.scheduling.quartz.CronTriggerBean;   
import org.springframework.scheduling.quartz.JobDetailBean;   
  
  
/**  
 * @author Seyo816@gmail.com  
 */  
public class JobListener   
{   
    
 public static void run() throws Exception {  
  
  ClassPathResource res = new ClassPathResource( "applicationContext-quartz.xml" );   
   XmlBeanFactory factory = new XmlBeanFactory( res );   
   JobDetailBean job = ( JobDetailBean ) factory   
     .getBean( "Job" );   
   CronTriggerBean trigger = ( CronTriggerBean ) factory   
     .getBean( "cronTrigger" );   
   Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler( );   
   scheduler.start( );   
   scheduler.scheduleJob( job, trigger );   
 }     
  
  
 public static void stop() throws Exception {  
  
       
 }     
}  

 

其中applicationContext-quartz.xml 放在classpath路径下,应用程序才可以找到该配置文件。配置文件定义了一个job bean 以及 触发器cronTrigger bean ,最后 通过 SchedulerFactoryBean 添加 添加触发器 。

applicationContext-quartz.xml  代码:

 

Xml代码
 

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"    
"http://www.springframework.org/dtd/spring-beans.dtd">  
<beans>  
  
 <bean name="Job" class="org.springframework.scheduling.quartz.JobDetailBean">  
    
  <property name="jobClass">  
   <value>com.yangxinyong.quartz.listener.Job</value>  
  </property>  
    
  <property name="jobDataAsMap">  
   <map>  
    <entry key="email"><value>seyo816@gmail.com</value></entry>  
   </map>  
  </property>  
    
    
 </bean>  
    
 <bean id="cronTrigger" class="com.yangxinyong.quartz.listener.InitializingCronTrigger">  
  <property name="jobDetail">  
   <ref bean="Job"/>  
  </property>  
  <property name="cronExpression">  
   <value>0 50 16 * * ?</value>  
  </property>  
 </bean>  
    
    
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  
  <!-- 添加触发器 -->  
  <property name="triggers">  
   <list>  
    <ref local="cronTrigger"/>  
   </list>  
  </property>  
 </bean>  
    
</beans>  

 

3、job bean  对应的类:com.yangxinyong.quartz.listener.Job 是spring的 QuartzJobBean接口的实现,用来定义 执行的任务。

Java代码
 

package com.yangxinyong.quartz.listener;   
  
import java.util.Date;   
  
import org.quartz.JobDetail;   
import org.quartz.JobExecutionContext;   
import org.quartz.JobExecutionException;   
import org.springframework.scheduling.quartz.QuartzJobBean;   
  
/**  
 * @author Seyo816@gmail.com  
 */  
public class Job extends QuartzJobBean {
  
 private String email;   
  
 protected void executeInternal(JobExecutionContext context)   
   throws JobExecutionException {   
  JobDetail job= context.getJobDetail();   
  System.out.println(new Date()+":"+job.getName()+"["+email+"]");
  
 }   
  
  
 public String getEmail() {   
  return email;   
 }   
  
 public void setEmail(String email) {   
  this.email = email;   
 }   
  
}  

 

该job只是简单的 在控制台中输出 一串字符串。

最后你可以 部署该 web应用,根据触发器中的时间配置,将实现 每天的16:50分的时候 执行操作。我们可以看到下面的输出字符串。

Tue Nov 18 16:50:00 CST 2008:Job[seyo816@gmail.com]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息