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

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

二. Scheduler 的开启,关闭和挂起


开启是 start(), 与以前一样, 重点是讲解一下 Scheduler 关闭和挂起。


二.一 关闭 shutdown() 及shutdown(flag)

二.一.一 工作任务类

//shutdown 用法
public class MyJob10 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);
    }
}


二.一.二 主程序测试

二.一.二.一 直接关闭

//shutdown 关闭 
public class SchedulerDemo10 {
    public static void main(String[] args) throws  Exception{
      //获取Scheduler
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        // 创建 JobDetail
        JobDetail jobDetail=JobBuilder.newJob(MyJob10.class)
                .withIdentity("job1","group1")
                .build();
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1") //设置标识
                .startNow()
               .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器
                .build();
        //关联 job和 trigger
        scheduler.scheduleJob(jobDetail,trigger);
        //启动 scheduler
        scheduler.start();
      //直接关闭
        scheduler.shutdown();
    }
}


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


image.png


直接关闭,没有任何任务执行。

二.一.二.二 休眠后关闭

改变代码,在关闭之前添加上休眠的代码

//休眠10s后,关闭
    Thread.sleep(10000);
    scheduler.shutdown();


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


image.png


共执行任务6次,(最开始时 1次+休眠时5次=6次),10s之后,关闭了调度器。


二.一.二.三 关闭后重新开启

关闭之后,是否能重新开启呢?


改变代码, 在 二.一.二.二 的基础上再添加一个 ‘重新启动’ 的代码

//休眠10s后,关闭
  Thread.sleep(10000);
  scheduler.shutdown();
  //休眠2s之后,重新启动
  Thread.sleep(2000);
  scheduler.start();


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

image.png


Exception in thread “main” org.quartz.SchedulerException: The Scheduler cannot be restarted after shutdown() has been called.


同时注意一下, 调度器的关闭顺序

13:02:05,625  INFO QuartzScheduler:666 - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
13:02:05,625  INFO QuartzScheduler:585 - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
13:02:05,626  INFO QuartzScheduler:740 - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.


二.一.三 shutdown() 的参数

调用shutdown() 关闭方法时,也可以传入参数

void shutdown(boolean waitForJobsToComplete)  throws SchedulerException;


参数 true 和false, 是有一定的区别的, 下面检测一下。


二.一.三.一 任务调度里面添加 休眠

//shutdown 用法
public class MyJob10 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      //添加休眠,验证一下 shutdown(flag) 的参数
      try {
    Thread.sleep(5000);
  } catch (InterruptedException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
  }
      //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("备份数据库的时间是:"+dateString);
    }
}


二.一.三.二 shutdown() 默认时

//shutdown 关闭 
public class SchedulerDemo10 {
    public static void main(String[] args) throws  Exception{
      //获取Scheduler
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        // 创建 JobDetail
        JobDetail jobDetail=JobBuilder.newJob(MyJob10.class)
                .withIdentity("job1","group1")
                .build();
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1") //设置标识
                .startNow()
               .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器
                .build();
        //关联 job和 trigger
        scheduler.scheduleJob(jobDetail,trigger);
        //启动 scheduler
        scheduler.start();
        //休眠10s后,关闭
       Thread.sleep(10000);
  //默认时
        scheduler.shutdown();
    }
}


控制台打印输出:

image.png


shutdown complete 在中间。


二.一.三.三 shutdown (false) 时

//休眠10s后,关闭
   Thread.sleep(10000);
   // 为false 时
    scheduler.shutdown(false);


控制台打印输出:

image.png


shutdown complete 在中间。


结果,与默认时是一样的。


二.一.三.四 shutdown(true) 时

//休眠10s后,关闭
Thread.sleep(10000);
// 为true 时
scheduler.shutdown(true);


控制台打印输出:

image.png


shutdown complete 在最后。


当 shutdown() 方法 传入 true时, 表示会等所有任务队列里面的任务运行完成后,才关闭。 传入false时,是直接关闭。


注意,无论是直接关闭 false,还是等运行完成后关闭 true, 都不会影响任务队列里面的任务继续运行。


二.二 挂起 standby()

挂起并不是关闭,只是暂时停止运行, 等一段时间后,是可以再次 start() 开启的。


二.二.一 任务接口

//挂起
public class MyJob11 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);
    }
}


二.二.二 主程序测试

//挂起 standby
public class SchedulerDemo11 {
    public static void main(String[] args) throws  Exception{
      //获取Scheduler
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        // 创建 JobDetail
        JobDetail jobDetail=JobBuilder.newJob(MyJob11.class)
                .withIdentity("job1","group1")
                .build();
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1") //设置标识
               .startNow()
               .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器
                .build();
        //关联 job和 trigger
        scheduler.scheduleJob(jobDetail,trigger);
        //启动 scheduler
        scheduler.start();
        //休眠10s后,挂起
        Thread.sleep(10000);
        scheduler.standby();
        //挂起10s后,重新开启
        Thread.sleep(10000);
        scheduler.start();
    }
}


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

image.png


挂起时间的那五次操作,又给补回来了,重复执行了5次。


如果这个任务执行的是数据库插入的操作,那么这个操作就会执行5遍,产生5条除id外相同的记录。


这样是不行的。


有没有一种方式,可以像数据库那样有个锁, 当队列里面有任务未执行结束时,不能进入?


有的,@DisallowConcurrentExecution 注解。

相关文章
|
存储 Java 调度
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
在一些业务场景中需要执行定时操作来完成一些周期性的任务,比如每隔一周删除一周前的某些历史数据以及定时进行某项检测任务等等。在日常开发中比较简单的实现方式就是使用Spring的@Scheduled(具体使用方法不再赘述)注解。但是在修改服务器时间时会导致定时任务不执行情况的发生,解决的办法是当修改服务器时间后,将服务进行重启就可以避免此现象的发生。本文将主要探讨服务器时间修改导致@Scheduled注解失效的原因,同时找到在修改服务器时间后不重启服务的情况下,定时任务仍然正常执行的方法。 @Scheduled失效原因分析 解析流程图 使用新的方法
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
|
存储 负载均衡 监控
分布式定时任务,你了解多少?基于Quartz实现分布式定时任务解决方案!
定时任务系统在应用平台中的重要性不言而喻,特别是互联网电商、金融等行业更是离不开定时任务。在任务数量不多、执行频率不高时,单台服务器完全能够满足。但是随着业务逐渐增加,定时任务系统必须具备高可用和水平扩展的能力,单台服务器已经不能满足需求。因此需要把定时任务系统部署到集群中,实现分布式定时任务系统集群。
5492 1
分布式定时任务,你了解多少?基于Quartz实现分布式定时任务解决方案!
|
固态存储 计算机视觉 异构计算
一起来学MediaPipe(一)人脸及五官定位检测
一起来学MediaPipe(一)人脸及五官定位检测
3979 0
一起来学MediaPipe(一)人脸及五官定位检测
|
XML SQL Java
Maven的三种打包方式(jar、shade、assembly)
Maven的三种打包方式(jar、shade、assembly)
5862 0
|
前端开发 Java 数据库连接
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
|
Linux
Linux - 解决使用 apt-get 安装 yum 的时耗报 E: Unable to locate package yum 的错误
Linux - 解决使用 apt-get 安装 yum 的时耗报 E: Unable to locate package yum 的错误
4024 0
Linux - 解决使用 apt-get 安装 yum 的时耗报 E: Unable to locate package yum 的错误
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 Distinct
【8月更文挑战第12天】
1540 4
在 MySQL 中使用 Distinct
|
Windows
Windows操作系统部署安装Kerberos客户端
详细介绍了在Windows操作系统上部署安装Kerberos客户端的完整过程,包括下载安装包、安装步骤、自定义安装路径、修改环境变量、配置hosts文件和Kerberos配置文件,以及安装后的验证步骤。
1290 3
Windows操作系统部署安装Kerberos客户端
|
安全 Java
Java“不兼容类型” 错误怎么查找解决
在 Java 中遇到“不兼容类型”错误时,首先理解错误信息,它表明试图将一种类型赋给不兼容的类型。检查代码中类型不匹配的赋值、方法调用参数类型不匹配、表达式类型不兼容及泛型类型不匹配等问题。解决方法包括进行类型转换、修改代码逻辑、检查方法参数和返回类型以及处理泛型类型不匹配。通过这些步骤,可以有效解决“不兼容类型”错误,确保代码类型兼容性良好。
2237 9
|
JSON 安全 Java
深入解析Jackson的ObjectMapper:核心功能与方法指南
深入解析Jackson的ObjectMapper:核心功能与方法指南
647 1