Spring定时任务

前段时间接到客户一个需求,要求对一个文件夹进行监听,当文件夹接收到推送的 txt 格式的数据后,进行解析入库。刚拿到这个需求的时候我的第一反应是写一个 FileObserver 监听,事实是第一版也是这么做的。但在实际应用的情况下发现,这么做并不是一个很好的解决方案。因为当我用新的线程启动监听的时候,一旦线程出错,该功能就无法继续使用,而解决方案只能是重启项目。后来一直就纠结在监听器的问题上。偶然间当我再次梳理监听模块代码时,发现其实监听也是会设置监听器刷新间隔的。于是乎,一个大胆的想法随即而生:用定时任务代替监听。那么既然要用定时任务,就存在一个技术选型问题。下面就对 QuartzSpring Task 做一个简单的对比。

Quartz

  • 默认多线程异步执行
  • 单个任务时,在上一个调度未完成时,下一个调度时间到时,会另起一个线程开始新的调度。业务繁忙时,一个任务会有多个调度,可能导致数据处理异常
  • 多个任务时,任务之间没有直接影响,多任务执行的快慢取决于CPU的性能
  • 触发方式 : (1)SimpleTrigger (2)CronTrigger
  • 需要在配置文件中实现配置Job
  • 能被集群实例化,支持分布式部署
    使用JobStoreCMT(JDBCJobStore的子类),Quartz 能参与JTA事务;Quartz 能管理JTA事务(开始和提交)在执行任务之间,这样,任务做的事就可以发生在JTA事务里

Spring Task

  • 默认单线程同步执行
  • 单个任务时,当前次的调度完成后,再执行下一次任务调度
  • 多个任务时,一个任务执行完成后才会执行下一个任务。若需要任务能够并发执行,需手动设置线程池
  • 触发方式:与Quartz的CronTrigger的表达式类似
  • 可以使用注解标注定时任务

由于我的需求比较简单,同时对多线程异步执行没有需求,且项目本身就是 SSM 框架,故最终决定使用 Spring Task 来完成定时任务的功能。

spring-mvc.xml



	
	
	

	
	
	
	

	
	

  

上述代码中,省略了部分代码,仅贴出了通过注解方式启动 Spring Task 所必须的部分。

SpringTask.java

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class SpringTask {
	private int num = 0;
	// 间隔1秒执行
	@Scheduled(cron = "0/1 * * * * ? ")
	public void taskCycle() {
		System.out.println("第 "+(++num)+" 次执行");
	}
}  

配置完成。项目启动后每秒执行一次输出,结果如下:

第 1 次执行
第 2 次执行
第 3 次执行
第 4 次执行
第 5 次执行

你可能感兴趣的:(定时任务,Spring,Task,定时器,Java,后台)