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

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd ">

	<!-- 添加注解驱动 -->
	<mvc:annotation-driven />
	<mvc:default-servlet-handler />

	<!-- 开启定时任务注解并设置线程池 -->
	<task:executor id="executor" pool-size="3" />
	<task:scheduler id="scheduler" pool-size="3" />
	<task:annotation-driven scheduler="scheduler" executor="executor" proxy-target-class="true" />

	<!-- 设置使用注解的类所在的包 -->
	<context:component-scan base-package="com.xxx.xxx" />

</beans>  

上述代码中,省略了部分代码,仅贴出了通过注解方式启动 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 次执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值