1. 程式人生 > >SpringBoot+quartz實現定時任務

SpringBoot+quartz實現定時任務

首先明白Quartz核心概念會變得很容易理解配置.
1、Job
表示一個工作,要執行的具體內容。此介面中只有一個方法
void execute(JobExecutionContext context)

2、JobDetail
JobDetail表示一個具體的可執行的排程程式,Job是這個可執行程排程程式所要執行的內容,另外JobDetail還包含了這個任務排程的方案和策略。

3、Trigger代表一個排程引數的配置,什麼時候去調。

4、Scheduler代表一個排程容器,一個排程容器中可以註冊多個JobDetail和Trigger。當Trigger與JobDetail組合,就可以被Scheduler容器排程了。

以下是主要的配置類

@Configuration  
public class SchedledConfiguration {  


    @Bean(name = "detailFactoryBean")  
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduledTasks scheduledTasks){  
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean ();  
        //這兒設定對應的Job物件  
bean.setTargetObject (scheduledTasks); //這兒設定對應的方法名 與執行具體任務排程類中的方法名對應 bean.setTargetMethod ("work"); bean.setConcurrent (false); return bean; } @Bean(name = "cronTriggerBean") public CronTriggerFactoryBean cronTriggerBean(MethodInvokingJobDetailFactoryBean detailFactoryBean){ CronTriggerFactoryBean trigger = new
CronTriggerFactoryBean (); trigger.setJobDetail (detailFactoryBean.getObject ()); try { trigger.setCronExpression ("0/5 * * ? * *");//每5秒執行一次 } catch (ParseException e) { e.printStackTrace (); } return trigger; } @Bean public SchedulerFactoryBean schedulerFactory(CronTriggerFactoryBean cronTriggerBean){ SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean (); schedulerFactory.setTriggers(cronTriggerBean.getObject()); return schedulerFactory; } }

以下是具體執行排程任務的類

@Component  
@Configurable  
@EnableScheduling  
public class ScheduledTasks {  

    public void work(){  
          //這兒插入具體的排程任務  
    }  
}  

總結:
總的說來,quartz的配置類主要就是以下三點.
(1)JobDetail(MethodInvokingJobDetailFactoryBean)的配置需要Job這個引數(具體執行排程任務的類,也就是例子中的ScheduledTasks ).

    (2)Trigger(CronTriggerFactoryBean)的配置需要JobDetail這個引數.同時需要配置cron表示式,這個下面談.

    (3)Scheduler(SchedulerFactoryBean)的配置需要Trigger這個引數.

PS:
cron表示式具體的東西可以網上搜,很多的,在這隻說我碰到的一個問題,cron表示式的第4位和第6位有一位必須是?

錯誤示例:
    0 0 0 * * *      這個期望表達的意思是每天0點排程一個任務,但是這樣寫會報錯.
    0 0 0 ? * *或者0 0 0 * * ?   這兩種表達都是每天0點排程一個任務,這樣寫才是正確的

這篇文章參照了以下三篇文章:
http://www.itnose.net/detail/6149670.html
http://blog.csdn.net/u010623907/article/details/46684515
http://lavasoft.blog.51cto.com/62575/181907/