Quartz 實現定時任務


以Springboot為例介紹通過Quartz作業調度框架實現定時任務。

1、引用Quartz依賴

<!--引入Quartz-->
<dependency>
     <groupId>org.quartz-scheduler</groupId>
     <artifactId>quartz</artifactId>
     <version>2.3.2</version>
</dependency>

2、實現具體的可執行的調度任務類,調度任務類需實現Quartz框架提供的Job接口。

@Override
public void execute(JobExecutionContext jobExecutionContext) {
    //獲取JobDetail中的JobDataMap
    JobDataMap jobDetailMap = jobExecutionContext.getJobDetail().getJobDataMap();
    for(Entry<String, Object> objectEntry: jobDetailMap.entrySet()){
        System.out.println("jobDetailMap---"+objectEntry.getKey()+" "+objectEntry.getValue());
    }
    //獲取trigger中的JobDataMap
    JobDataMap triggerMap = jobExecutionContext.getTrigger().getJobDataMap();
    for(Entry<String, Object> objectEntry: triggerMap.entrySet()){
        System.out.println("triggerMap---"+objectEntry.getKey()+" "+objectEntry.getValue());
    }
    //獲取trigger和JobDetail中的JobDataMap總和,如果有同一個key,則后者會將前者覆蓋
    JobDataMap allMap = jobExecutionContext.getMergedJobDataMap();
    for(Entry<String, Object> objectEntry: allMap.entrySet()){
        System.out.println("allMap"+objectEntry.getKey()+" "+objectEntry.getValue());
    }
}

  

3、實現任務調度邏輯,使用@PostConstruct使此定時任務在項目啟動時即開始運行。

@PostConstruct
public void buildQuartz(){

    JobBuilder jobBuilder = JobBuilder.newJob(QuartzService.class).withIdentity(jobName,jobGroupName);
    jobBuilder.usingJobData("jobDetail參數","jobDetail值");

    JobDetail jobDetail = jobBuilder.build();

    /*
    * 按照指定間隔時間執行
    * startNow()馬上執行
    * withIntervalInSeconds(1) 按秒循環,1s循環一次
    * repeatForever() 永遠循環
    * */
    Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
        .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
        .build();

    //表達式調度構建器
    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ? *")
        .withMisfireHandlingInstructionDoNothing();

    /*
     *  按照cron格式 定時執行
     * */
    Trigger triggerCron = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
        .startNow().withSchedule(scheduleBuilder).usingJobData("trigger參數","trigger值")
        .build();

    SchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
    Scheduler scheduler = null;
    try {
        scheduler = stdSchedulerFactory.getScheduler();
        scheduler.scheduleJob(jobDetail,triggerCron);
        scheduler.start();
    } catch (SchedulerException e) {
        e.printStackTrace();
    }
}

  

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM