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);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。