现在用的多的定时器有两种,其一是Quartz,其二是Schedule,Schedule是Spring内部自己集成的,提供了几个注解来很方便的定义及使用,我们就以这种形式来讲解说明。
首先需要能让Spring引入Schedule的使用许可:
@EnableScheduling
在配置文件上使用这个注解,此注解间接的注册了一个BeanPostProcessor: ScheduledAnnotationBeanPostProcessor,
他会解析Spring容器内每一个Bean上是否有指定的注解(@Scheduled),若有则会将这个方法生成一个ScheduledTask实例,根据@Scheduled注解内的时间规则定期执行被标识的方法。
package com.bob.config.mvc.timer;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import com.bob.config.mvc.timer.quartz.QuartzTaskExample;
import com.bob.config.mvc.timer.schedule.ScheduleTask;
/**
* 定时器配置,推荐使用@Schedule的形式配置
*
* @since 2017年4月4日 上午9:33:56
* @author jjb
*
*/
@Configuration
@ComponentScan()
@EnableScheduling
public class TimerContextConfig {
/**
* 基于@Schedule方法的定时器配置
*/
/**
* Schedule线城池
*
* @return
*/
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler taskSchedule = new ThreadPoolTaskScheduler();
taskSchedule.setPoolSize(5);
return taskSchedule;
}
/**
*
* Quartz定时器配置
*
*/
// @Bean
public MethodInvokingJobDetailFactoryBean taskInfo(QuartzTaskExample quartzTaskExample) {
MethodInvokingJobDetailFactoryBean taskInfo = new MethodInvokingJobDetailFactoryBean();
taskInfo.setTargetObject(quartzTaskExample);
taskInfo.setTargetMethod("execute");
return taskInfo;
}
// @Bean
public CronTriggerFactoryBean quartzTrigger(JobDetail taskInfo) {
CronTriggerFactoryBean quartzTrigger = new CronTriggerFactoryBean();
quartzTrigger.setJobDetail(taskInfo);
quartzTrigger.setCronExpression("0/20 * * * * ?");
return quartzTrigger;
}
// @Bean
public SchedulerFactoryBean registerQuartz(CronTrigger quartzTrigger) {
SchedulerFactoryBean registerQuartz = new SchedulerFactoryBean();
registerQuartz.setTriggers(quartzTrigger);
return registerQuartz;
}
}
Schedule使用方式:
package com.bob.config.mvc.timer.schedule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 自定义一个定时器,定时器的间隔可以*配置,看@Schedule内的属性
*
* @since 2017年4月3日 下午8:29:15
* @version $Id$
* @author JiangJibo
*
*/
@Component
public class ScheduleTask {
final static Logger LOGGER = LoggerFactory.getLogger(ScheduleTask.class);
//'cron', 'fixedDelay(String)', or 'fixedRate(String)' 这几个属性只能有一个
@Scheduled(initialDelay = 300000, fixedDelay = 300000) // 在容器初始化后5分钟执行第一次,之后每5分钟执行一次
public void invokeEvery5Min() {
LOGGER.debug("每5分钟尝试执行一次");
}
}
Quartz使用方式:
package com.bob.config.mvc.timer.quartz;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 定时器任务类
*
* @since 2017年2月13日 下午5:02:14
* @version $Id$
* @author JiangJibo
*
*/
@Component
public class QuartzTaskExample {
final static Logger LOGGER = LoggerFactory.getLogger(QuartzTaskExample.class);
/**
* 定时执行此方法
*/
public void execute() {
LOGGER.info("{}:执行定时任务!", this.getClass().getSimpleName());
}
}