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 注解。

相关文章
|
10月前
|
JavaScript API 数据安全/隐私保护
5 大主流电商商品详情解析实战手册:淘宝 / 京东 / 拼多多 / 1688 / 唯品会核心字段提取 + 反爬应对 + 代码示例
本文详解淘宝、京东、拼多多、1688、唯品会五大电商平台商品详情页的数据解析逻辑,涵盖价格、SKU、库存、供应商等核心字段提取,针对各平台动态渲染、字体加密、API调用、反爬机制等难点提供完整代码与应对策略,助力开发者高效实现电商数据采集与分析。
|
数据安全/隐私保护
xshell7,xftp7个人免费版官方下载,无需破解,免激活,下载即可使用
xshell7,xftp7个人免费版官方下载,无需破解,免激活,下载即可使用
22407 0
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3286 1
|
监控 网络安全 调度
Quartz.Net整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案
解决Quartz.NET在.NET Core 3.1应用中部署到IIS服务器上不被调度的问题,通常需要综合考虑应用配置、IIS设置、日志分析等多个方面。采用上述策略,结合细致的测试和监控,可以有效地提高定时任务的稳定性和可靠性。在实施任何更改后,务必进行充分的测试,以验证问题是否得到解决,并监控生产环境的表现,确保长期稳定性。
1830 1
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
NoSQL 前端开发 Redis
Windows 下安装和配置 Redis (图文教程)
Windows 下安装和配置 Redis (图文教程)
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
36603 1
|
关系型数据库 MySQL Java
Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could
解决方法: 配置H2数据库或者MySQL数据库,其中配置MySQL解决方法如下: 1、添加 MySQL连接驱动的依赖 Maven工程在pom.xml中添加
3458 0
|
缓存 Linux
解决CentOS 7停止更新后yum源失效问题【图文教程】
以上步骤完成后,你的 CentOS 7 系统就会使用阿里云的 yum 源,更换yum以后就可以正常使用啦。
15693 2