Spring集成Quartz实现定时任务和异步作业调度

只愿长相守 提交于 2020-01-30 02:54:44

Quartz是开源组织OpenSymphony的一个作业调度框架,采用多线程架构,可伸缩性强,可集群扩展。Spring集成Quartz简单高效,只需实现Job接口,在方法execute()中添加业务逻辑。

 

本文分享Spring集成和配置Quartz的方法,并封装一个REST接口,演示项目中的实际应用。

 

代码文件

功能要点

SpringBoot集成Quartz

pom.xml

引入Quartz依赖:spring-boot-starter-quartz

application.yml

配置Quartz属性,配置Job运行时间cron表达式

QuartzConfig.java

配置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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!