springboot中的定時任務
阿新 • • 發佈:2018-12-19
第一種使用Java自帶的定時任務:
public class TestTimer { public static void main(String[] args) { TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("task run:"+ new Date()); } }; Timer timer = new Timer(); //安排指定的任務在指定的時間開始進行重複的固定延遲執行。這裡是每3秒執行一次 timer.schedule(timerTask,10,3000); } }
第二種使用springboot自己的定時任務:
第一步在 SpringApplication主類上加
@EnableScheduling註解
第二步:自定義,一個類 並寫一個方法,在你想要定時的方法上使用
@Scheduled(fixedDelay = 1000*60*120)註解即可
注意:自定義的方法需要使用@Component註解將其交予容器管理,否則定時任務不生效
第三種使用quartz框架與springboot整合:
quartz是一個簡單易用但功能強大的任務排程框架 ,在springboot中使用它首先需要在maven中匯入quartz包
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-quartz --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>2.0.5.RELEASE</version> </dependency>
第一步使用javaconfig去配置bean
因為springboot主類本身就是一個javaconfig所以我就在主類上配置bean
quartz關鍵點有job(實際執行的類),jobDetail(用於對執行物件的描述配置),trigger(如何去執行job),schedua(真正去執行job)r這四大元件:
建立一個job類並寫一個需要執行定時任務的方法(簡單省略了)
配置jobDetail bean:
/** * * 如果job只是普通類使用該bean * * @return the method invoking job detail factory bean */ @Bean public MethodInvokingJobDetailFactoryBean detailFactoryBean(){ MethodInvokingJobDetailFactoryBean detailFactoryBean =new MethodInvokingJobDetailFactoryBean(); //定時任務類 detailFactoryBean.setTargetObject(new SystemInfolJob()); //定時任務執行方法 detailFactoryBean.setTargetMethod("getInfo"); //不讓其並非執行 detailFactoryBean.setConcurrent(false); return detailFactoryBean; } /** * 如果Job實現了job介面使用該bean * * @return the job detail factory bean */ @Bean public JobDetailFactoryBean jobDetailFactoryBean (){ JobDetailFactoryBean jobDetailFactoryBean =new JobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(SimpleJob.class); return jobDetailFactoryBean; }
配置Trigger bean(springboot提供多種trigger):
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
SimpleTriggerFactoryBean simpleTriggerFactoryBean =new SimpleTriggerFactoryBean();
simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
simpleTriggerFactoryBean.setStartDelay(0);
simpleTriggerFactoryBean.setRepeatInterval(2000);
return simpleTriggerFactoryBean;
}
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(MethodInvokingJobDetailFactoryBean detailFactoryBean){
CronTriggerFactoryBean cronTriggerFactoryBean =new CronTriggerFactoryBean();
cronTriggerFactoryBean.setJobDetail(detailFactoryBean.getObject());
cronTriggerFactoryBean.setCronExpression("0/1 * * * * ? ");
return cronTriggerFactoryBean;
}
配置Scheduler
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean,SimpleTriggerFactoryBean simpleTriggerFactoryBean){
SchedulerFactoryBean factoryBean =new SchedulerFactoryBean();
factoryBean.setTriggers(cronTriggerFactoryBean.getObject());
return factoryBean;
}