SpringBoot之旅 -- 定時任務兩種(Spring Schedule 與 Quartz 整合 )實現 SpringBoot之旅 -- 定時任務兩種(Spring Schedule 與 Quar

SpringBoot之旅 -- 定時任務兩種(Spring Schedule 與 Quartz 整合 )實現

 

相關文章

Spring Boot 相關文章目錄html

前言

最近在項目中使用到定時任務,以前一直都是使用Quartz 來實現,最近看Spring 基礎發現其實Spring 提供 Spring Schedule 能夠幫助咱們實現簡單的定時任務功能。
下面說一下兩種方式在Spring Boot 項目中的使用。java

Spring Schedule 實現定時任務

Spring Schedule 實現定時任務有兩種方式 1. 使用XML配置定時任務, 2. 使用 @Scheduled 註解。 由於是Spring Boot 項目 可能儘可能避免使用XML配置的形式,主要說註解的形式.spring

Spring Schedule 提供三種形式的定時任務:springboot

固定等待時間 @Scheduled(fixedDelay = 時間間隔 )

@Component public class ScheduleJobs { public final static long SECOND = 1 * 1000; FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss"); @Scheduled(fixedDelay = SECOND * 2) public void fixedDelayJob() throws InterruptedException { TimeUnit.SECONDS.sleep(2); System.out.println("[FixedDelayJob Execute]"+fdf.format(new Date())); } }

固定間隔時間 @Scheduled(fixedRate = 時間間隔 )

@Component public class ScheduleJobs { public final static long SECOND = 1 * 1000; FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss"); @Scheduled(fixedRate = SECOND * 4) public void fixedRateJob() { System.out.println("[FixedRateJob Execute]"+fdf.format(new Date())); } }

Corn表達式 @Scheduled(cron = Corn表達式)

@Component public class ScheduleJobs { public final static long SECOND = 1 * 1000; FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss"); @Scheduled(cron = "0/4 * * * * ?") public void cronJob() { System.out.println("[CronJob Execute]"+fdf.format(new Date())); } }

Spring Boot 整合 Quartz 實現定時任務

添加Maven依賴

<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency>

Spring Boot 整合 Quartz

Spring 項目整合 Quartz 主要依靠添加 SchedulerFactoryBean 這個 FactoryBean ,因此在maven 依賴中添加 spring-context-support 。markdown

首先添加 QuartzConfig 類 來聲明相關Beanmaven

@Configuration public class QuartzConfig { @Autowired private SpringJobFactory springJobFactory; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setJobFactory(springJobFactory); return schedulerFactoryBean; } @Bean public Scheduler scheduler() { return schedulerFactoryBean().getScheduler(); } }

這裏咱們須要注意 我注入了一個 自定義的JobFactory ,而後 把其設置爲SchedulerFactoryBean 的 JobFactory。其目的是由於我在具體的Job 中 須要Spring 注入一些Service。
因此咱們要自定義一個jobfactory, 讓其在具體job 類實例化時 使用Spring 的API 來進行依賴注入。ide

SpringJobFactory 具體實現:spring-boot

@Component public class SpringJobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }

具體使用 (摘取自項目代碼):post

@Service public class QuartzEventServiceImpl implements QuartzEventService { private static final String JOB_GROUP = "event_job_group"; private static final String TRIGGER_GROUP = "event_trigger_group"; @Autowired private Scheduler scheduler; @Override public void addQuartz(Event event) throws SchedulerException { JSONObject eventData = JSONObject.parseObject(event.getEventData()); Date triggerDate = eventData.getDate("date"); JobDetail job = JobBuilder.newJob(EventJob.class).withIdentity(event.getId().toString(), JOB_GROUP).usingJobData(buildJobDateMap(event)).build(); Trigger trigger = TriggerBuilder.newTrigger().withIdentity(event.getId().toString(), TRIGGER_GROUP).startAt(triggerDate).build(); scheduler.scheduleJob(job, trigger); }
 
分類:  Spring Boot
相關文章
相關標籤/搜索