Spring集成Quartz實現定時任務和異步做業調度

Quartz是開源組織OpenSymphony的一個做業調度框架,採用多線程架構,可伸縮性強,可集羣擴展。Spring集成Quartz簡單高效,只需實現Job接口,在方法execute()中添加業務邏輯
java

 

本文分享Spring集成和配置Quartz的方法,並封裝一個REST接口,演示項目中的實際應用。git


代碼文件github

功能要點spring

SpringBoot集成Quartz數據庫

pom.xml多線程

引入Quartz依賴spring-boot-starter-quartz架構

application.ymlapp

配置Quartz屬性,配置Job運行時間cron表達式框架

QuartzConfig.javaide

配置Bean: JobDetail, Trigger,讀取cron運行時間配置

實現定時任務

QuartzJob.java

實現Job接口,或者繼承QuartzJobBean類

功能調用

CheckController.java

增長REST接口/chk/job,建立一個Job定時任務,Scheduler上下文Context傳遞數據。

 

代碼

Github下載:https://github.com/jextop/StarterApi/

Quartz示例:https://github.com/rickding/HelloJava/tree/master/HelloQuartz

 

SpringBoot集成Quartz

1. 新建SpringBoot項目時,選中Quartz,將自動添加Quartz依賴。

image.png 

2. 已有SpringBoot項目,能夠在pom.xml中直接添加Quartz依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

3. application.yml中配置Quartz,指定任務存儲類型:

memory:內存方式,默認。

jdbc:數據庫方式,將建立數據表並保存任務信息。

spring:
  quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: always

 

job:
  quartz:
    cron: 0 0/23 * * * ?

4. QuartzConfig.java中配置Bean,聲明JobDetail和Trigger,使用cron表達式設置任務運行時間:

@Configuration
@ConfigurationProperties("job.quartz")
public class QuartzConfig {
    private String cron;

    @Bean
    public JobDetail quartzJob() {
        return JobBuilder.newJob(QuartzJob.class).storeDurably().build()

    }

    @Bean
    public Trigger quartzTrigger() {
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);

        return TriggerBuilder.newTrigger()
                .forJob(quartzJob())
                .withSchedule(scheduleBuilder)
                .build();
    }

    public String getCron() {
        return cron;
    }

    public void setCron(String cron) {
        this.cron = cron;
    }
}

 

定時任務QuartzJob.java,實現Job接口,或者繼承QuartzJobBean類。

JobExecutionContext中讀取附加信息,執行業務邏輯。

public class QuartzJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        LogUtil.info("quartz job ", new Date());

        try {
            JextService jextService = (JextService) context.getScheduler().getContext().get("jextService");
            if (jextService != null) {
                jextService.getInfo(true);
            }
        } catch (SchedulerException e) {
            LogUtil.info(e.getMessage());
        }
    }
}

 

功能調用

1. 增長RestController:CheckController.java

2. 增長REST接口/chk/job,建立一個定時任務,添加附加信息到Scheduler上下文中。

@GetMapping(value = "/chk/job")
public Object job() {
    JobDetail job = JobBuilder.newJob(QuartzJob.class).build();
    SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
            .forJob(job)
            .startAt(new Date())
            .build();

    Date date = null;
    try {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.getContext().put("jextService", jextService);

        date = scheduler.scheduleJob(job, trigger);
        scheduler.startDelayed(1);
    } catch (SchedulerException e) {
        e.printStackTrace();
    }

    final Date jobDate = date;
    return new HashMap<String, Object>() {{
        put("chk", "job");
        put("date", jobDate);
    }};
}

 

REST接口調用定時任務建立示例

image.png

相關文章
相關標籤/搜索