spring+quartz实现定时任务(每天零点删除指定文件夹中缓存文件)

在接触到quartz之前,我一直自己写线程开启定时器执行定时任务,后来发现quartz完全可以轻松实现定时任务,它的实质也是通过多线程处理,Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发执行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。

闲话不多说,接下来我将通过一个示例来讲解一下quartz实现定时任务。该示例实现的功能是每天零点删除指定文件夹中缓存文件。使用spring+quartz至少需要

commons-logging-1.2.jar,

jta.jar,

quartz-1.6.6.jar,

commons-collections-3.2.jar,

spring.jar

这几个jar包,至于版本大家根据实际情况进行调整。

  1. 在web.xml文件中配置spring的配置文件读取路径
    
    	
    		contextConfigLocation
    		classpath*:spring/**/*.xml,
    	

  2. 新建一个xml文件,取名quartz_other.xml,用来配置bean和定时任务
    
    
    
    	
    	
    		
    	
    	
    		
    	
    	
    
    	
    	
    	
    	
    	
    
    

  3. 新建一个接口ClearCatchService,用来处理具体方法
    package com.ultrapower.eoms.integrate.service;
    
    import java.util.List;
    
    import com.ultrapower.eoms.integrate.model.Message;
    
    public interface ClearCatchService {
    	
    	/**
    	 * 清除缓存
    	 * @param userid
    	 * @param content
    	 */
    	
    	
    	public void clearCatch();
    }
    

  4. 建立这个接口的实现类ClearCatchManager
    public class ClearCatchManager extends BaseAction  implements ClearCatchService{
    
    	@Override                 
    	public void clearCatch() {
    		//获取本文件的绝对路径
    		String path1=ClearCatchManager.class.getResource("").getPath();
    		//根据目标文件路径进行截取
    		String path2=path1.substring(1, path1.indexOf("WebRoot"));
    		//获得目标文件路径
    		String path3=path2+"WebRoot/wordexport/tmpdoc" ;
    		delFile(path3);
    	}
    	/**
    	 * 
    	 * 实现删除指定目录下的所有文件
    	 */
    	private void delFile(String path){
    		File file = new File(path);
    		if (file.exists()) {
    			String[] tempList = file.list();
    			File temp = null;
    			for (int i = 0; i < tempList.length; i++) {
    				if (path.endsWith(File.separator)) {
    					temp = new File(path + tempList[i]);
    				} else {
    					temp = new File(path + File.separator + tempList[i]);
    				}
    				if (temp.isFile()) {
    					temp.delete();
    
    				}
    
    			}
    
    		}
    	}
    
    
    
    }
    

  5. 建立业务类ClearCatchThread,调用接口方法
    package com.ultrapower.eoms.integrate.manager;
    
    import com.ultrapower.eoms.integrate.service.ClearCatchService;
    
    
    
    public class ClearCatchThread {
    	private  ClearCatchService clearCatchService;
    	public void clearCatch(){
    		clearCatchService.clearCatch();
    	}
    	public void setClearCatchService(ClearCatchService clearCatchService) {
    		this.clearCatchService = clearCatchService;
    	}
    	
    	
    }
    

  6. 在quartz_other.xml中配置定时任务和触发器
    	
    		
    		
    		
    		
    	
    		
    			
    		
    		
    			
    			0 0 0 * * ?
    		
    	

  7. 在quartz_other.xml中将触发器注册进来
    
    	
    		
    			
    			
    			
    			 
    			
    			
    		
    		
    			
    				
    				
    					org.quartz.simpl.RAMJobStore
    				
    				
    				
    					org.quartz.simpl.SimpleThreadPool
    				
    				10
    			
    		
    	

  8. 好了,到这里即可实现定时任务了,大家可以在执行删除的时候在日志中打印一下标记,即可确认是否成功执行定时任务,我就不多说了。那么,完整的quartz_other.xml如下
    
    
    
    	
    	
    		
    	
    	
    		
    	
    	
    	
    		
    		
    		
    		
    	
    		
    			
    		
    		
    			
    			0 0 0 * * ?
    		
    	
    	
    	
    	
    	
    	
    	
    		
    			
    			
    			
    			 
    			 
    			
    		
    		
    			
    				
    				
    					org.quartz.simpl.RAMJobStore
    				
    				
    				
    					org.quartz.simpl.SimpleThreadPool
    				
    				10
    			
    		
    	
    
    

  9.   说明:

             1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。

                   字段名                 允许的值                        允许的特殊字符  

                   秒                         0-59                               , - * /  

                   分                         0-59                               , - * /  

                   小时                   0-23                               , - * /  

                   日                         1-31                               , - * ? / L W C  

                   月                         1-12 or JAN-DEC          , - * /  

                   周几                     1-7 or SUN-SAT            , - * ? / L C #  

                   年 (可选字段)     empty, 1970-2099      , - * /

                   “?”字符:表示不确定的值

                   “,”字符:指定数个值

                   “-”字符:指定一个值的范围

                   “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m

                   “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X

                   “W”字符:指定离给定日期最近的工作日(周一到周五)

                   “#”字符:表示该月第几个周X。6#3表示该月第3个周五

             2)Cron表达式范例:

                     每隔5秒执行一次:*/5 * * * * ?

                     每隔1分钟执行一次:0 */1 * * * ?

                     每天23点执行一次:0 0 23 * * ?

                     每天凌晨1点执行一次:0 0 1 * * ?

                     每月1号凌晨1点执行一次:0 0 1 1 * ?

                     每月最后一天23点执行一次:0 0 23 L * ?

                     每周星期天凌晨1点实行一次:0 0 1 ? * L

                     在26分、29分、33分执行一次:0 26,29,33 * * * ?

                     每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?


你可能感兴趣的:(java)