发表于: 2019-10-24 21:42:38

1 839


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)

一:学习quartz

Quartz API

  • Scheduler - 与调度程序交互的主要API。搭配trigger和job
  • Job - 由希望由调度程序执行的组件实现的接口。做什么工作
  • JobDetail - 用于定义作业的实例。
  • Trigger(即触发器) - 定义执行给定作业的计划的组件。什么时候工作
  • JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
  • TriggerBuilder - 用于定义/构建触发器实例。


job管理:

Job 组成部分

Job 其实是由 3 个部分组成:
JobDetail: 用于描述这个Job是做什么的
实现Job的类: 具体干活的
JobDataMap: 给 Job 提供参数用的

JobDataMap 除了usingJobData 方式之外,还可以是其他方式,像这样

job.getJobDataMap().put("email", "admin@taobao.com");

Job 并发

默认的情况下,无论上一次任务是否结束或者完成,只要规定的时间到了,那么下一次就开始。

有时候会做长时间的任务,比如数据库备份,这个时候就希望上一次备份成功结束之后,才开始下一次备份,即便是规定时间到了,也不能开始,因为这样很有可能造成 数据库被锁死 (几个线程同时备份数据库,引发无法预计的混乱)。

那么在这种情况下,给数据库备份任务增加一个注解就好了:

@DisallowConcurrentExecution 

Job 异常

任务里发生异常是很常见的。 异常处理办法通常是两种:
1. 当异常发生,那么就通知所有管理这个 Job 的调度,停止运行它
2. 当异常发生,修改一下参数,马上重新运行

中断 Job

在业务上,有时候需要中断任务,那么这个Job需要实现 InterruptableJob 接口,然后就方便中断了

SimpleTrigger

Trigger 就是触发器的意思,用来指定什么时间开始触发,触发多少次,每隔多久触发一次.
SimpleTrigger 可以方便的实现一系列的触发机制。

下一个8秒的倍数

SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。比如,你有一个trigger,你可以设置它在2015年1月13日的上午11:23:54准时触发,或者在这个时间点触发,并且每隔2秒触发一次,一共重复5次。

SimpleTrigger的属性包括:开始时间结束时间重复次数以及重复的间隔。这些属性的含义与你所期望的是一致的,只是关于结束时间有一些地方需要注意。

重复次数,可以是0正整数,以及常量SimpleTrigger.REPEAT_INDEFINITELY。重复的间隔,必须是0,或者long型的正数,表示毫秒。注意,如果重复间隔为0,trigger将会以重复次数并发执行(或者以scheduler可以处理的近似并发数)


如果你还不熟悉DateBuilder,了解后你会发现使用它可以非常方便地构造基于开始时间(或终止时间)的调度策略。

endTime属性的值会覆盖设置重复次数的属性值;比如,你可以创建一个trigger,在终止时间之前每隔10秒执行一次,你不需要去计算在开始时间和终止时间之间的重复次数,只需要设置终止时间并将重复次数设置为REPEAT_INDEFINITELY(当然,你也可以将重复次数设置为一个很大的值,并保证该值比trigger在终止时间之前实际触发的次数要大即可)。

SimpleTrigger实例通过TriggerBuilder设置主要的属性,通过SimpleScheduleBuilder设置与SimpleTrigger相关的属性。要使用这些builder的静态方法,需要静态导入:
指定时间开始触发,不重复:

SimpleTrigger trigger = (SimpleTrigger) newTrigger()
       .withIdentity("trigger1", "group1")
       .startAt(myStartTime)                     // some Date
       .forJob("job1", "group1")                 // identify job with name, group strings
       .build();

指定时间触发,每隔10秒执行一次,重复10次:

trigger = newTrigger()
       .withIdentity("trigger3", "group1")

       .startAt(myTimeToStartFiring)  // 如果未指定开始时间(如果省略了此行),则表示“现在”        

       .withSchedule(simpleSchedule()

              .withIntervalInSeconds(10)
              .withRepeatCount(10)) // 注意重复十次,执行十一次
       .forJob(myJob) // identify job with handle to its JobDetail itself                  
       .build();

5分钟以后开始触发,仅执行一次:

trigger = (SimpleTrigger) newTrigger()
       .withIdentity("trigger5", "group1")

       .startAt(futureDate(5, IntervalUnit.MINUTE)) // 使用DateBuilder创建将来的日期

       .forJob(myJobKey) // identify job with its JobKey

       .build();

立即触发,每个5分钟执行一次,直到22:00:

trigger = newTrigger()
       .withIdentity("trigger7", "group1")
       .withSchedule(simpleSchedule()
             .withIntervalInMinutes(5)
             .repeatForever())
             .endAt(dateOf(22, 0, 0))
       .build();

建立一个触发器,将在下一个小时的整点触发,然后每2小时重复一次:

trigger = newTrigger()

       .withIdentity("trigger8") // 由于未指定组,因此“ trigger8”将位于默认组中

       .startAt(evenHourDate(null)) // 得到下一个偶数小时(分钟和秒为零(“ 00:00”))

       .withSchedule(simpleSchedule()
           .withIntervalInHours(2)
           .repeatForever())

       // 请注意,在此示例中,没有调用“ forJob(..)”,这是有效的

       // 如果触发器与作业一起传递给调度程序

       .build();

       scheduler.scheduleJob(trigger, job);

TriggerBuilder(以及Quartz的其它builder)会为那些没有被显式设置的属性选择合理的默认值。比如:如果你没有调用withIdentity(..)方法,TriggerBuilder会为trigger生成一个随机的名称;如果没有调用startAt(..)方法,则默认使用当前时间,即trigger立即生效。

利用datebuilder方法

Date startTime = DateBuilder.nextGivenSecondDate(null, 8);
            SimpleTrigger trigger = (SimpleTrigger) newTrigger()
                   .withIdentity("trigger1", "group1")
                   .startAt(startTime)      //设置开始时间是每隔8秒开始,没有设置次数,使用默认值
               .build();
System.out.printf("%s 这个任务会在 %s 准时开始运行,累计运行%d次,间隔时间是%d毫秒%n", job.getKey(), ft.toLocaleString(), trigger.getRepeatCount()+1, trigger.getRepeatInterval());

10 秒后运行

使用方法:

DateBuilder.futureDate()


可以方便的获取10秒后, 5分钟后, 3个小时候,2个月后这样的时间

Date startTime = DateBuilder.futureDate(10, DateBuilder.IntervalUnit.SECOND);//10秒后运行
            SimpleTrigger trigger = (SimpleTrigger) newTrigger()
                   .withIdentity("trigger1", "group1")
                   .startAt(startTime)      
               .build();


累计n次,间隔n秒

Date startTime = DateBuilder.nextGivenSecondDate(null, 8);
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
       .withIdentity("trigger1", "group1")
       .startAt(startTime)      //设置开始时间是每隔8秒开始
       .withSchedule(simpleSchedule()
               .withRepeatCount(3)  //重复4
               .withIntervalInSeconds(1))//1秒间隔一次
       .build();
System.out.printf("%s 这个任务会在 %s 准时开始运行,累计运行%d次,间隔时间是%d毫秒%n", job.getKey(), ft.toLocaleString(), trigger.getRepeatCount()+1, trigger.getRepeatInterval());



明天计划的事情:(一定要写非常细致的内容)
遇到的问题:(遇到什么困难,怎么解决的)

收获:(通过今天的学习,学到了什么知识)

简单学习了simpletrigger。会写简单的定时任务。


返回列表 返回列表
评论

    分享到