• 定时组件的实现


    日历定时组件的使用:

    1、在web.xml添加监听

     <listener>
        <listener-class>richinfo.calendar.util.TasksSystemListener</listener-class>
      </listener>

    2、增加task.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <tasks>
     3      <task name="CalendarWaitThread" class="richinfo.calendar.service.CalendarWaitThread">
     4         <desc>日程定时器待下发服务(24小时)</desc>
     5      </task>
     6      <task name="CalendarThread" class="richinfo.calendar.service.CalendarThread">
     7         <desc>日程定时器下发服务(1分钟)</desc>
     8      </task>
     9     <task name="SendSubLabelMsg" class="richinfo.calendar.service.SubcribeCalendarThread">
    10         <desc>日程定时器下发服务(1分钟)</desc>
    11      </task>
    12      <task name="SendEmailSms" class="richinfo.calendar.service.CalendarEmailSmsSendThread">
    13         <desc>待办任务短信下发</desc>
    14      </task>
    15      <task name="CalendarEmailSmsWaitThread" class="richinfo.calendar.service.CalendarEmailSmsWaitMsgThread">
    16         <desc>待办任务短信扫描</desc>
    17      </task>
    18      <!--  
    19      <task name="ScanningLabelThead" class="richinfo.calendar.service.CalendarScanningLabelThead">
    20         <desc>定时扫描日历信息表</desc>
    21      </task>
    22      -->
    23      <task name="CalendarDailyRemindThread" class="richinfo.calendar.service.CalendarDailyRemindThread">
    24         <desc>每日邮件见扫描(24小时)</desc>
    25      </task>
    26    <timer>
    27         <!-- 每天凌晨2点执行 -->
    28         <cron>0 15,7 * * *</cron>
    29         <task-ref ref="CalendarWaitThread" />
    30     </timer>
    31     <timer>
    32         <!-- 每天4.7点执行 -->
    33         <cron>0 12,13 * * *</cron>
    34         <task-ref ref="CalendarEmailSmsWaitThread" />
    35     </timer>
    36     <timer>
    37         <!-- 每隔1分钟执行 -->
    38         <delay>5m</delay>
    39         <repeat-interval>1m</repeat-interval>
    40         <task-ref ref="CalendarThread" />
    41     </timer>
    42     <timer>
    43         <!-- 每隔1分钟执行 -->
    44         <delay>5m</delay>
    45         <repeat-interval>1m</repeat-interval>
    46         <task-ref ref="SendSubLabelMsg" />
    47     </timer>
    48     <timer>
    49         <!-- 每隔1分钟执行 -->
    50         <delay>5m</delay>
    51         <repeat-interval>1m</repeat-interval>
    52         <task-ref ref="SendEmailSms" />
    53     </timer>
    54      <!--  
    55    <timer>
    56         <delay>5m</delay>
    57         <repeat-interval>1m</repeat-interval>
    58         <task-ref ref="ScanningLabelThead" />
    59     </timer>
    60     -->
    61     <timer>
    62         <!-- 每天凌晨2点执行 -->
    63         <cron>0 4,7 * * *</cron>
    64         <task-ref ref="CalendarDailyRemindThread" />
    65     </timer>
    66 </tasks>

    3、实现类

    richinfo.calendar.service.CalendarWaitThread

    richinfo.calendar.service.CalendarThread

    richinfo.calendar.service.SubcribeCalendarThread

    这些个方法实现了init,repeat方法

    java有自己的定时任务处理的类,而室内的定时组件复用了Quartz

    定时组件的原理如下:

    定时器模块整体处理模型:

    定时器模块中最重要的是任务调度监控器(JobSchedulerMonitor)

    它会定时去JobStore查看已经到点要触发的触发器,

    得到之后再使用JobExecutor运行对应的任务.

    1.Trigger通过实现Comparable接口实现Trigger之间的排序功能,

    排序因素主要有: 下一次触发时间和任务优先级.

    2.等待调度的Trigger是保存在TreeSet里面的, 会自动完成排序,

    也就是TreeSet里面第一个Trigger肯定是最近需要触发的触发器.

    3.触发器在每一次触发之前都需要判断是否错过了触发时间,

    如果错过了则需要考虑策略问题(是马上触发还是使用下一次触发).

    当前实现的策略是(在Trigger类里实现):

    1. 如果错过时间在50秒内则不算错过触发时间, 继续执行.
    2. 如果没有下一次触发时间了, 马上触发.
    3. 如果错过的时间小于2分钟, 马上触发.
    4. 如果错过的时间大于2分钟, 但是离下一次触发的时间大于5分钟, 马上触发.
    5. 其他情况使用下一次触发时间.

        4.触发器在每一次触发之前还需要计算下一次触发时间,

    更新上一次触发时间, 更新触发次数.(在Trigger类里实现).

    5. 任务调度流程图:

    任务调度监控器(richinfo.bcomponet.tasks.scheduler.core.JobSchedulerMonitor)

    是关键的核心.

  • 相关阅读:
    [原创]快速排序(C++版)
    连接mysql8.0时报错的问题
    关于idea无法使用搜狗输入法打出汉字的解决方案(转)
    bootStrap select组件相关问题
    idea 项目可以运行但是jsp中url报红的问题
    idea 项目启动找不到页面问题和run/debug只能启动一个的问题
    form序列化到后台中文乱码
    在js中获取bootStrap table 的属性
    三元运算符,多条件时判断
    Spring获取日期时间差8小时问题解决
  • 原文地址:https://www.cnblogs.com/wanghongye/p/5220027.html
Copyright © 2020-2023  润新知