SpringBoot結合Quartz實現定時
阿新 • • 發佈:2018-11-15
使用quartz實現定時任務。
quartz框架提供了一把觸發器型別,但兩個最常用的是SimpleTrigger和CronTrigger。SimpleTrigger為需要簡單打火排程而設計。典型地,如果你需要在給定的時間和重複次數或者兩次打火之間等待的秒數打火一個作業,那麼SimpleTrigger適合你。另一方面,如果你有許多複雜的作業排程,那麼或許需要CronTrigger。
在pom.xml中新增依賴
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.17.RELEASE</version> </dependency>
方式一:直接採取配置檔案的方式
job可通過普通類來實現
任務類
@Component @Configurable @EnableScheduling public class ScheduledTasks{ public void reportCurrentTime(){ System.out.println ("Scheduling Tasks Examples: The time is now " + dateFormat ().format (new Date())); } //每1分鐘執行一次 public void reportCurrentByCron(){ System.out.println ("Scheduling Tasks Examples By Cron: The time is now " + dateFormat ().format (new Date ())); } private SimpleDateFormat dateFormat(){ return new SimpleDateFormat ("HH:mm:ss"); } }
觸發器配置類
@Configuration public class quartzconfiguration { //使用jobDetail工場來製作任務 @Bean(name = "detailFactoryBean") public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduledTasks scheduledTasks){ MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean (); bean.setTargetObject (scheduledTasks); bean.setTargetMethod ("reportCurrentByCron"); //選擇執行的任務,即方法 bean.setConcurrent (false); return bean; } //設定觸發器 //將觸發器與job繫結 、 利用時間表達式進行定時 @Bean(name = "cronTriggerBean") public CronTriggerBean cronTriggerBean(MethodInvokingJobDetailFactoryBean detailFactoryBean){ CronTriggerBean tigger = new CronTriggerBean (); tigger.setJobDetail (detailFactoryBean.getObject ()); try { tigger.setCronExpression ("0/5 * * * * ? ");//每5秒執行一次 } catch (ParseException e) { e.printStackTrace (); } return tigger; } //SchedulerFactoryBean:主要的管理的工廠,這是最主要的一個bean。quartz通過這個工廠來進行對各觸發器的管理。 //將觸發器放入 課表工廠 @Bean public SchedulerFactoryBean schedulerFactory(CronTriggerBean[] cronTriggerBean){ SchedulerFactoryBean bean = new SchedulerFactoryBean(); System.err.println (cronTriggerBean[0]); bean.setTriggers (cronTriggerBean); return bean; } }
方式二:對Quartz進行封裝
實現job介面的方式來製作任務 重寫execute方法
public class ScheduledTasks implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException{
System.out.println ("Scheduling Tasks Examples By Cron: The time is now " + dateFormat ().format (new Date ()));
}
private SimpleDateFormat dateFormat(){
return new SimpleDateFormat ("HH:mm:ss");
}
}
觸發器的抽象類
public abstract class BaseCronTrigger extends CronTriggerBean implements Serializable {
private static final long serialVersionUID = 1L;
public void init(){
// 得到任務
JobDetail jobdetail = new JobDetail (this.getClass ().getSimpleName (),this.getMyTargetObject ().getClass ());
this.setJobDetail (jobdetail);
this.setJobName (jobdetail.getName ());
this.setName (this.getClass ().getSimpleName ());
try {
this.setCronExpression (this.getMyCronExpression ());
} catch (java.text.ParseException e) {
e.printStackTrace ();
}
}
public abstract String getMyCronExpression();
public abstract Job getMyTargetObject();
}
觸發器的具體類
可以根據業務自定義 並且上傳給SchedulerFactoryBean
SchedulerFactoryBean:主要的管理的工廠,這是最主要的一個bean。quartz通過這個工廠來進行對各觸發器的管理。
//這是一個具體的 已經繫結任務的觸發器
@Component
public class InitializingCronTrigger extends BaseCronTrigger implements Serializable {
@Autowired
private org.springframework.scheduling.quartz.SchedulerFactoryBean schedulerFactoryBean;
//用這種方式自動繫結
//注入IOC容器會自動呼叫器構造方法
public InitializingCronTrigger() {
super.init ();
}
//設定任務cron
@Override
public String getMyCronExpression() {
return "0/5 * * * * ?";
}
//這裡體現了控制反轉的思想
//將set 變成get的方式
@Override
public Job getMyTargetObject() {
return new ScheduledTasks ();
}
//SchedulerFactoryBean:主要的管理的工廠,這是最主要的一個bean。quartz通過這個工廠來進行對各觸發器的管理。
public void parse(){
try {
schedulerFactoryBean.getObject ().pauseAll ();
} catch (SchedulerException e) {
e.printStackTrace ();
}
}
}
配置類
@Configuration
public class quartzconfiguration {
//SchedulerFactoryBean:主要的管理的工廠,這是最主要的一個bean。quartz通過這個工廠來進行對各觸發器的管理。
//將觸發器放入 課表工廠
@Bean
public SchedulerFactoryBean schedulerFactory(CronTriggerBean[] cronTriggerBean){
SchedulerFactoryBean bean = new SchedulerFactoryBean();
System.err.println (cronTriggerBean[0]);
bean.setTriggers (cronTriggerBean);
return bean;
}
}