主要依赖quartz.jar相关类 判断cron表达式 , 在下次即将执行的时间在指定时间内时, 从线程池中取线程进行调度 (优化版)
为什么要有调度中心
因为在集群环境,多server都会在同一时间执行相同定时任务,那么此时定时任务的并发会造成大量数据重复或其它不可预知的业务异常.而调度中心只会按间隔触发一次请求给集群中的负载去分发.不会造成重复触发的情况.
场景
前台工作人员录入定时任务信息入TBL_TASK表后, 调度中心以很短的间隔定时全量抓取库 TBL_TASK表判断表达式时间是否临近10秒以内,如果临近了,就触发请求给目标系统,让目标系统进行真正的业务处理(比如进行百万级别的数据同步),然后只需要返回一个成功失败标志告诉调度中心,最终统一从调度中心去观察任务正常与否.也方便了集中管理任务调度.
只要配置好相关信息,就不用在spring或java 等trigger中去配置定时任务了.
下载资料
定时任务quartz 包 : quartz-2.2.3.zip
项目源码 : http://pan.baidu.com/s/1nu9oK4p
git地址: https://git.oschina.net/KingBoBo/TimeTaskDispatcherCenter.git
相关表:
TBL_TASK表结构如下,您不必建表,此处只是假设有这样的表存在而以.为了方便演示,最终只是模拟取数,并不会真正从数据库中取该表数据
| 主键 | 任务名 | 调度中心调度地址 | 执行间隔表达式 |
| C_ID | C_NAME | C_URL | C_EXPRESSION |
| employeeTask | 调用X系统进行员工信息同步 | http://www.xxx.com/syncEmployees | 0/10 * * * * ? |
| carTask | 调用Y系统进行车辆信息同 | http://www.yyy.com/syncCars | 0 0/1 * * * ? |
相关类:
MyTask.java
普通任务Bean,对应数据表 TBL_TASK
package com.king; /** * 普通任务javaBean,从数据库取到数据到放到该对象中 * @author King * */ public class MyTask { String id; String name; String url; String expression; long delayMillis;// 延迟执行时间 单位毫秒 boolean isApproaching; public MyTask(String id, String name, String url, String expression) { super(); this.id = id; this.name = name; this.url = url; this.expression = expression; } public String getExpression() { return expression; } public void setExpression(String expression) { this.expression = expression; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public long getDelayMillis() { return delayMillis; } public void setDelayMillis(long delayMillis) { this.delayMillis = delayMillis; } public boolean isApproaching() { return isApproaching; } public void setApproaching(boolean isApproaching) { this.isApproaching = isApproaching; } @Override public String toString() { return "MyTask [>; } }