Quartz的Scheduler的关闭和挂起,并发控制(四)上

简介: Quartz的Scheduler的关闭和挂起,并发控制(四)上

一. SimpleScheduleBuilder


SimpleScheduleBuilder,简单调度建造者,用于生成调度时间, 接下来,老蝴蝶重点讲解一下,它的用法。


关于它的接口方法,可以观看第二章节的内容。


一.一 调度方法演示

一.一.一 编写 Job 任务

//用于测试  SimpleScheduleBuilder
public class MyJob8 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("备份数据库的时间是:"+dateString);
    }
}


一.一.二 立即启动,调度方法演示

一.一.二.一 repeatSecondlyForever() 方法

// SimpleScheduleBuilder 方法展示
public class SchedulerDemo8 {
    public static void main(String[] args) throws  Exception{
      //获取Scheduler
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        // 创建 JobDetail
        JobDetail jobDetail=JobBuilder.newJob(MyJob8.class)
                .withIdentity("job1","group1")
                .build();
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1") //设置标识
                .startNow()
    //每秒钟执行一次
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever())
                .build();
        //关联 job和 trigger
        scheduler.scheduleJob(jobDetail,trigger);
        //启动 scheduler
        scheduler.start();
    }
}


运行程序,控制台打印输出:

image.png


一直运行,每1s(默认值) 执行一次


一.一.二.二 repeatSecondlyForever(int seconds) 方法

只需要将调度的那行代码替换可:

//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever())
  .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))


控制台打印输出:

image.png


一直运行,每隔两秒(参数传入值)运行一次。


一.一.二.三 repeatSecondlyForTotalCount(int count) 方法

//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever())
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3))


控制台打印输出:

image.png

只运行了三次,每隔1s(默认值)运行。

一.一.二.四 repeatSecondlyForTotalCount(int count, int seconds) 方法

//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever())
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3))
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3, 2))


控制台打印输出:

image.png


只运行三次,每隔2s运行。


一.一.三 设置开始日期和结束日期启动

上面启动Trigger时,用的是 startNow(), 立即启动,也可以用 startAt(date) 和endAt(date) 来动态地设置 启动时间和结束时间, 常常用于条件触发和条件结束。


可以在任务里面,通过 JobExecutionContext 上下文来获取 开始时间和结束时间。


一.一.三.一 任务接口

//获取开始时间和结束时间
public class MyJob9 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        //是设置的开始时间和结束时间,不会改变
        System.out.println("开始时间:"+sdf.format(jobExecutionContext.getTrigger().getStartTime()));
        System.out.println("结束时间:"+sdf.format(jobExecutionContext.getTrigger().getEndTime()));
        System.out.println("备份数据库的时间是:"+dateString);
    }
}


一.一.三.二 主程序调用

//startAt 和endAt 的用法
public class SchedulerDemo9 {
    public static void main(String[] args) throws  Exception{
      //获取Scheduler
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        // 创建 JobDetail
        JobDetail jobDetail=JobBuilder.newJob(MyJob9.class)
                .withIdentity("job1","group1")
                .build();
         //当前时间
        Date nowDate=new Date();
        //开始时间为 当前时间往后4s,即推迟4s执行
        Date startDate=new Date(nowDate.getTime()+4000);
        //结束时间,往后跑10秒
        Date endDate=new Date(startDate.getTime()+10000);
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1") //设置标识
                .startAt(startDate)
                .endAt(endDate)
    // 设置为简单触发器,2s触发一次
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) 
                .build();
        //关联 job和 trigger
        scheduler.scheduleJob(jobDetail,trigger);
        //启动 scheduler
        scheduler.start();
    }
}


一.一.三.三 控制台打印输出

程序运行,大约4s之后,才打印出日志信息:


控制台打印输出:

image.png


虽然程序还在运行,但并不会执行任务,结束时间到了,一共执行了5次。


延迟4s执行, endDate-startDate=10s, 每2秒执行一次, 故执行 10/2=5 次。


在结束日期到时,会停止执行任务。


一.一.三.四 注意点

在任务类 MyJob9里面,打印了开始日期和结束日期, 如果在主程序里面,并没有设置 endAt(), 即没有设置结束日期, 那么获取时会出错。

//.endAt(endDate)


一.一.三.五 结束日期和运行次数先后关系

一.一.三.二的程序时,调度器是一直运行,但触发器Trigger 设置了结束日期, 当时间到达触发器的结束日期时,不会再继续执行作业调度了。


演示1: 当设置调度的次数时(5,5):

//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器
  .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(5,5)) //想执行5次,超过结束日期


控制台打印输出:


image.png


只执行了2次, 到 Trigger 结束时间时暂停。


演示2: 当设置调度次数为(2,2)

//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(5,5))  //想执行5次,超过结束日期
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(2,2)) //想执行2次,未到结束时间


控制台打印输出:

image.png


只执行了2次。


结束日期和调度次数, 哪个条件先触发,就按照哪个条件的结果走。


相关文章
|
SQL 消息中间件 负载均衡
Hologres+Flink实时数仓详解
本次内容将会介绍使用Flink和Hologres,实现可扩展的、高效的、云原生实时数仓。
29325 1
Hologres+Flink实时数仓详解
|
安全 前端开发 PHP
[PiKaChu靶场通关]文件包含file include
[PiKaChu靶场通关]文件包含file include
916 0
[PiKaChu靶场通关]文件包含file include
|
缓存 JavaScript 前端开发
用 vite 2 平滑升级 vue 2 + webpack 项目实战
用 vite 2 平滑升级 vue 2 + webpack 项目实战
|
11月前
|
数据采集 DataWorks 监控
‌DataWorks的主要功能‌
‌DataWorks的主要功能‌
912 1
|
Java 数据库连接 Nacos
Nacos2.2.3支持达梦
Nacos2.2.3支持达梦
1756 2
|
JavaScript
vue 下载页面中的图片,如二维码
vue 下载页面中的图片,如二维码
165 1
|
机器学习/深度学习 并行计算 Linux
轻松上手:Linux下metis与mt-metis的全面安装和使用教程
Linux下的metis与mt-metis的安装和使用 本文的Linux包括VMare和windows下的WSL环境下安装metis串行和并行 本文还讲述了电脑的线程以及和超线程的区别,如何寻找,如何判别,请看下文
712 0
|
存储 对象存储 数据安全/隐私保护
这个错误提示表明你没有权限列出OSS的存储桶
这个错误提示表明你没有权限列出OSS的存储桶
647 1
|
存储 Linux 调度
高效定时任务处理:深入学习Python中APScheduler库的奥秘
高效定时任务处理:深入学习Python中APScheduler库的奥秘
17239 7
高效定时任务处理:深入学习Python中APScheduler库的奥秘