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次。


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


相关文章
|
1月前
|
资源调度 Java
在SchedulerX中,你可以使用`schedulerx.submitTask(taskName)`方法来提交并执行单个任务
【1月更文挑战第7天】【1月更文挑战第34篇】在SchedulerX中,你可以使用`schedulerx.submitTask(taskName)`方法来提交并执行单个任务
27 1
|
Java Spring
@Scheduled 多个定时任务同时执行
这篇文章主要介绍了springBoot @Scheduled实现多个任务同时开始执行,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
778 0
|
1月前
|
存储 JavaScript 前端开发
RxJS中的调度器(Scheduler)机制
RxJS中的调度器(Scheduler)机制
75 0
|
7月前
|
Java 调度
@Scheduled阻塞导致未执行生效
@Scheduled阻塞导致未执行生效
|
Java 调度
ScheduledExecutorService:多线程任务调度
ScheduledExecutorService:多线程任务调度
706 0
ScheduledExecutorService:多线程任务调度
|
Java
使用ScheduledExecutorService线程池创建定时任务
使用ScheduledExecutorService线程池创建定时任务
225 0
|
Java API 调度
多线程实现Spring定时任务@Scheduled
多线程实现Spring定时任务@Scheduled
|
存储 Java API
调度线程池ScheduledThreadPoolExecutor源码解析
调度线程池ScheduledThreadPoolExecutor源码解析
123 0
调度线程池ScheduledThreadPoolExecutor源码解析
有关使用ScheduledThreadPoolExecutor实现定时处理任务
有关使用ScheduledThreadPoolExecutor实现定时处理任务
107 0
Quartz的Scheduler的关闭和挂起,并发控制(四)下
Quartz的Scheduler的关闭和挂起,并发控制(四)下
408 0
Quartz的Scheduler的关闭和挂起,并发控制(四)下