SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法
前言
最近在项目中使用到定时任务,之前一直都是使用Quartz来实现,最近看Spring基础发现其实Spring提供SpringSchedule可以帮助我们实现简单的定时任务功能。
下面说一下两种方式在SpringBoot项目中的使用。
SpringSchedule实现定时任务
SpringSchedule实现定时任务有两种方式1.使用XML配置定时任务,2.使用@Scheduled注解。因为是SpringBoot项目可能尽量避免使用XML配置的形式,主要说注解的形式.
SpringSchedule提供三种形式的定时任务:
固定等待时间@Scheduled(fixedDelay=时间间隔)
@Component publicclassScheduleJobs{ publicfinalstaticlongSECOND=1*1000; FastDateFormatfdf=FastDateFormat.getInstance("yyyy-MM-ddHH:mm:ss"); @Scheduled(fixedDelay=SECOND*2) publicvoidfixedDelayJob()throwsInterruptedException{ TimeUnit.SECONDS.sleep(2); System.out.println("[FixedDelayJobExecute]"+fdf.format(newDate())); } }
固定间隔时间@Scheduled(fixedRate=时间间隔)
@Component publicclassScheduleJobs{ publicfinalstaticlongSECOND=1*1000; FastDateFormatfdf=FastDateFormat.getInstance("yyyy-MM-ddHH:mm:ss"); @Scheduled(fixedRate=SECOND*4) publicvoidfixedRateJob(){ System.out.println("[FixedRateJobExecute]"+fdf.format(newDate())); } }
Corn表达式@Scheduled(cron=Corn表达式)
@Component publicclassScheduleJobs{ publicfinalstaticlongSECOND=1*1000; FastDateFormatfdf=FastDateFormat.getInstance("yyyy-MM-ddHH:mm:ss"); @Scheduled(cron="0/4****?") publicvoidcronJob(){ System.out.println("[CronJobExecute]"+fdf.format(newDate())); } }
SpringBoot整合Quartz实现定时任务
添加Maven依赖
org.quartz-scheduler quartz org.springframework spring-context-support
SpringBoot整合Quartz
Spring项目整合Quartz主要依靠添加SchedulerFactoryBean这个FactoryBean,所以在maven依赖中添加spring-context-support。
首先添加QuartzConfig类来声明相关Bean
@Configuration publicclassQuartzConfig{ @Autowired privateSpringJobFactoryspringJobFactory; @Bean publicSchedulerFactoryBeanschedulerFactoryBean(){ SchedulerFactoryBeanschedulerFactoryBean=newSchedulerFactoryBean(); schedulerFactoryBean.setJobFactory(springJobFactory); returnschedulerFactoryBean; } @Bean publicSchedulerscheduler(){ returnschedulerFactoryBean().getScheduler(); } }
这里我们需要注意我注入了一个自定义的JobFactory,然后把其设置为SchedulerFactoryBean的JobFactory。其目的是因为我在具体的Job中需要Spring注入一些Service。
所以我们要自定义一个jobfactory,让其在具体job类实例化时使用Spring的API来进行依赖注入。
SpringJobFactory具体实现:
@Component publicclassSpringJobFactoryextendsAdaptableJobFactory{ @Autowired privateAutowireCapableBeanFactorycapableBeanFactory; @Override protectedObjectcreateJobInstance(TriggerFiredBundlebundle)throwsException{ ObjectjobInstance=super.createJobInstance(bundle); capableBeanFactory.autowireBean(jobInstance); returnjobInstance; } }
具体使用(摘取自项目代码):
@Service publicclassQuartzEventServiceImplimplementsQuartzEventService{ privatestaticfinalStringJOB_GROUP="event_job_group"; privatestaticfinalStringTRIGGER_GROUP="event_trigger_group"; @Autowired privateSchedulerscheduler; @Override publicvoidaddQuartz(Eventevent)throwsSchedulerException{ JSONObjecteventData=JSONObject.parseObject(event.getEventData()); DatetriggerDate=eventData.getDate("date"); JobDetailjob=JobBuilder.newJob(EventJob.class).withIdentity(event.getId().toString(),JOB_GROUP).usingJobData(buildJobDateMap(event)).build(); Triggertrigger=TriggerBuilder.newTrigger().withIdentity(event.getId().toString(),TRIGGER_GROUP).startAt(triggerDate).build(); scheduler.scheduleJob(job,trigger); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。