Spring基于注解形式的内嵌定时器使用(Schedule,Quartz)

时间:2021-05-22 14:36:58

现在用的多的定时器有两种,其一是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());
}

}