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的配置文件读取路径
    <!-- Spring ApplicationContext配置文件的路径�可使用通配符,多个路径用�,号分隔此参数用于后面的Spring-Context loader -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath*:spring/**/*.xml,</param-value>
    	</context-param>

  2. 新建一个xml文件,取名quartz_other.xml,用来配置bean和定时任务
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans default-lazy-init="false">
    	
    	<!-- 清除突发事件模块导出文件产生缓存定时任务 begin -->
    	<bean id="clearCatchService" class="com.ultrapower.eoms.integrate.manager.ClearCatchManager"/>	
    	
    	<bean id="clearCatchThread"
    		class="com.ultrapower.eoms.integrate.manager.ClearCatchThread" >
    		<property name="clearCatchService" ref="clearCatchService"/>
    	</bean>
    	
    
    	<!-- 清除突发事件模块导出文件产生缓存定时任务  end -->
    	
    	
    	
    	
    </beans>
    

  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中配置定时任务和触发器
    	<bean id="clearCatchThreadMethod"
    		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    		<property name="targetObject" ref="clearCatchThread"></property>
    		<property name="targetMethod" value="clearCatch"></property>
    		<property name="concurrent" value="false"></property>
    	</bean>	
    	<bean id="clearCatch"
    		class="org.springframework.scheduling.quartz.CronTriggerBean">
    		<property name="jobDetail">
    			<ref local="clearCatchThreadMethod" />
    		</property>
    		<property name="cronExpression">
    			<!-- 每天零点执行 0 0 0 0 * * ? -->
    			<value>0 0 0 * * ?</value>
    		</property>
    	</bean>

  7. 在quartz_other.xml中将触发器注册进来
    <!-- 容器:将触发器注册进来 -->
    	<bean id="schedulerother"
    		class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
    		<property name="triggers">
    			<!-- 注册触发器(Trigger) -->
    			<list>
    			
    			 <ref bean="clearCatch"/>
    			
    			</list>
    		</property>
    		<property name="quartzProperties">
    			<props>
    				<!-- 随机存储,非持久化 -->
    				<prop key="org.quartz.jobStore.class">
    					org.quartz.simpl.RAMJobStore
    				</prop>
    				<!-- 线程池 -->
    				<prop key="org.quartz.threadPool.class">
    					org.quartz.simpl.SimpleThreadPool
    				</prop>
    				<prop key="org.quartz.threadPool.threadCount">10</prop>
    			</props>
    		</property>
    	</bean>

  8. 好了,到这里即可实现定时任务了,大家可以在执行删除的时候在日志中打印一下标记,即可确认是否成功执行定时任务,我就不多说了。那么,完整的quartz_other.xml如下
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans default-lazy-init="false">
    	
    	<!-- 清除突发事件模块导出文件产生缓存定时任务 begin -->
    	<bean id="clearCatchService" class="com.ultrapower.eoms.integrate.manager.ClearCatchManager"/>	
    	
    	<bean id="clearCatchThread"
    		class="com.ultrapower.eoms.integrate.manager.ClearCatchThread" >
    		<property name="clearCatchService" ref="clearCatchService"/>
    	</bean>
    	
    	<bean id="clearCatchThreadMethod"
    		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    		<property name="targetObject" ref="clearCatchThread"></property>
    		<property name="targetMethod" value="clearCatch"></property>
    		<property name="concurrent" value="false"></property>
    	</bean>	
    	<bean id="clearCatch"
    		class="org.springframework.scheduling.quartz.CronTriggerBean">
    		<property name="jobDetail">
    			<ref local="clearCatchThreadMethod" />
    		</property>
    		<property name="cronExpression">
    			<!-- 每天零点执行 0 0 0 0 * * ? -->
    			<value>0 0 0 * * ?</value>
    		</property>
    	</bean>
    	<!-- 清除突发事件模块导出文件产生缓存定时任务  end -->
    	
    	
    	
    	<!-- 容器:将触发器注册进来 -->
    	<bean id="schedulerother"
    		class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
    		<property name="triggers">
    			<!-- 注册触发器(Trigger) -->
    			<list>
    			
    			 <ref bean="clearCatch"/>
    			 
    			</list>
    		</property>
    		<property name="quartzProperties">
    			<props>
    				<!-- 随机存储,非持久化 -->
    				<prop key="org.quartz.jobStore.class">
    					org.quartz.simpl.RAMJobStore
    				</prop>
    				<!-- 线程池 -->
    				<prop key="org.quartz.threadPool.class">
    					org.quartz.simpl.SimpleThreadPool
    				</prop>
    				<prop key="org.quartz.threadPool.threadCount">10</prop>
    			</props>
    		</property>
    	</bean>
    </beans>
    

  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 * * ?


  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Spring Boot和Quartz实现定时任务管理,可以让你更方便地管理和监控你的定时任务。下面是一个使用Spring Boot、QuartzSpring MVC实现定时任务管理的示例: 首先,在你的Spring Boot应用程序添加QuartzSpring MVC的依赖项: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 然后,在你的Spring Boot应用程序创建一个Quartz的调度器,并添加一个Spring MVC的Controller来管理定时任务: ```java @Configuration public class QuartzConfig { @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setTriggers(myTaskTrigger().getObject()); return schedulerFactoryBean; } @Bean public JobDetailFactoryBean myTaskJob() { JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(MyTask.class); return jobDetailFactoryBean; } @Bean public CronTriggerFactoryBean myTaskTrigger() { CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setJobDetail(myTaskJob().getObject()); cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?"); // 每5秒执行一次 return cronTriggerFactoryBean; } } @RestController public class TaskController { @Autowired private Scheduler scheduler; @PostMapping("/tasks") public void addTask(@RequestBody TaskInfo taskInfo) throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(taskInfo.getJobClass()) .withIdentity(taskInfo.getJobName(), taskInfo.getJobGroup()) .build(); CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity(taskInfo.getTriggerName(), taskInfo.getTriggerGroup()) .withSchedule(CronScheduleBuilder.cronSchedule(taskInfo.getCronExpression())) .build(); scheduler.scheduleJob(jobDetail, trigger); } @DeleteMapping("/tasks/{jobName}/{jobGroup}") public void deleteTask(@PathVariable String jobName, @PathVariable String jobGroup) throws SchedulerException { JobKey jobKey = new JobKey(jobName, jobGroup); scheduler.deleteJob(jobKey); } } ``` 在上面的代码,我们创建了一个Spring MVC的Controller来管理定时任务。我们使用了Scheduler类来添加和删除定时任务。在添加定时任务时,我们使用了TaskInfo类来封装定时任务的信息。在删除定时任务时,我们使用了jobName和jobGroup来识别定时任务。 最后,在你的定时任务实现Job接口,并在类上添加@DisallowConcurrentExecution注解,以确保每个任务执行时只有一个实例: ```java @Component @DisallowConcurrentExecution public class MyTask implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 定时任务执行的代码 } } ``` 以上就是使用Spring Boot、QuartzSpring MVC实现定时任务管理的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值