关于java:springbootroute二十一quartz实现动态定时任务

47次阅读

共计 3999 个字符,预计需要花费 10 分钟才能阅读完成。

Quartz是一个定时工作的调度框架,波及到的次要概念有以下几个:

Scheduler:调度器,所有的调度都由它管制,所有的工作都由它治理。

Job:工作,定义业务逻辑。

JobDetail:基于 Job,进一步封装。其中关联一个 Job,并为 Job 指定更具体的信息。

Trigger:触发器,能够指定给某个工作,指定工作的触发机制。

一 创立简略工作

1.1 Quartz 依赖

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

1.2 创立工作

工作创立须要实现 Job 接口,重写 execute(JobExecutionContext jobExecutionContext) 办法,减少定时工作的业务逻辑,这里我只是简略的打印一下定时工作执行。

@Slf4j
public class SimpleJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {log.info("job execute---"+new Date());
    }
}

1.3 JobDetail 减少属性

这里减少的属性能够在 Job 实现类中获取,来解决业务。

JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                                // 工作标识,及工作分组
                                .withIdentity("job1", "group1")
                                // 链接调用,减少须要的参数
                                .usingJobData("name","Java 旅途")
                                .usingJobData("age",18)
                                .build();

1.4 Trigger 实现

Trigger 分为两种,SimpleTriggerCronTriggerSimpleTrigger 是依据 Quartz 的一些 api 实现的简略触发行为。CronTrigger用的比拟多,应用 cron 表达式进行触发。这里先用 SimpleTrigger 来实现。

SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
                                            .withIdentity("trigger1", "group1")
                                            // 立刻执行
                                            .startNow()
                                            // 10s 后进行
                                            .endAt(new Date(System.currentTimeMillis()+10*1000))
                                            .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                                            // 每秒执行一次
                                            .withIntervalInSeconds(1)
                                            // 始终执行
                                            .repeatForever()).build();

1.5 启动工作

@Autowired
private Scheduler scheduler;

scheduler.scheduleJob(jobDetail,simpleTrigger);

1.6 执行成果

启动我的项目后,工作立刻执行,每秒执行一次,10s 后进行,执行效果图如下:

二 动静操作定时工作

有时候除了曾经开发好的定时工作外,还须要咱们手动去创立工作并且管制工作的执行。

2.1 创立工作

@GetMapping("create")
public void createJob(String jobName,String jobGroup,String cron,String triggerName,String triggerGroup) throws SchedulerException {JobKey jobKey = new JobKey(jobName,jobGroup);
    // 如果存在这个工作,则删除
    if(scheduler.checkExists(jobKey)) {scheduler.deleteJob(jobKey);
    }

    JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
        .withIdentity(jobKey)
        .build();

    CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);

    Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity(triggerName,triggerGroup)
        .withSchedule(cronScheduleBuilder).build();
    scheduler.scheduleJob(jobDetail,trigger);
}

2.2 暂停工作

@GetMapping("pause")
public void pauseJob(String jobName,String jobGroup) throws SchedulerException {JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {return;}
    scheduler.pauseJob(jobKey);
}

2.3 复原暂停的工作

@GetMapping("remuse")
public void remuseJob(String jobName, String jobGroup) throws SchedulerException {JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {return;}
    scheduler.resumeJob(jobKey);
}

2.4 删除定时工作

@GetMapping("remove")
public void removeJob(String jobName, String jobGroup,String triggerName,String triggerGroup) throws SchedulerException {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    Trigger trigger =  scheduler.getTrigger(triggerKey);
    if (trigger == null) {return;}
    // 进行触发器
    scheduler.pauseTrigger(triggerKey);
    // 移除触发器
    scheduler.unscheduleJob(triggerKey);
    // 删除工作
    scheduler.deleteJob(jobKey);
}

三 工作长久化

Quartz 默认应用 RAMJobStore 存储形式将工作存储在内存中,除了这种形式还反对应用 JDBC 将工作存储在数据库,为了避免工作失落,咱们个别会将工作存储在数据库中。

这里应用 mysql 进行存储,在 quartz 的源码包中找到文件 tables_mysql_innodb.sql,而后在客户端进行运行 sql 文件。如果嫌源码包不好下载的话,我曾经将 sql 文件上传至GitHub 了,能够间接拜访 github 拉去表构造,数据表如下:

3.1 减少 mysql 和 jdbc 依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

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

3.2 指定应用 jdbc 存储

quartz 默认应用 memory 存储,这里批改成 jdbc 进行存储,并配置 jdbc 的相干信息

spring:
  quartz:
    job-store-type: jdbc
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/simple_fast
    username: root
    password: root

3.3 创立工作

启动我的项目,调用 create 接口创立工作,而后数据表中就会新增工作相干的数据了。

此是 spring-boot-route 系列的第二十一篇文章,这个系列的文章都比较简单,次要目标就是为了帮忙首次接触 Spring Boot 的同学有一个零碎的意识。本文已收录至我的 github,欢送各位小伙伴star

github:https://github.com/binzh303/s…

点关注、不迷路

如果感觉文章不错,欢送 关注 点赞 珍藏,你们的反对是我创作的能源,感激大家。

如果文章写的有问题,请不要吝惜文笔,欢送留言指出,我会及时核查批改。

如果你还想更加深刻的理解我,能够微信搜寻「Java 旅途」进行关注。回复「1024」即可取得学习视频及精美电子书。每天 7:30 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!

正文完
 0