add getTaskTable

This commit is contained in:
Looly 2019-09-21 07:36:42 +08:00
parent 46fd3912d4
commit 8d51e2343d
11 changed files with 166 additions and 53 deletions

View File

@ -13,6 +13,7 @@
* 【system】 增加SystemPropsKeysissue#550@Github * 【system】 增加SystemPropsKeysissue#550@Github
* 【core】 FileUtil.normalize在win下支持samba路径issue#549@Github * 【core】 FileUtil.normalize在win下支持samba路径issue#549@Github
* 【core】 修复Validator注释错误pr#70@Gitee * 【core】 修复Validator注释错误pr#70@Gitee
* 【cron】 添加获取任务表的方法issue#I12E5H@Gitee
### Bug修复 ### Bug修复
* 【core】 修复DateUtil.offset导致的时区错误问题issue#I1294O@Gitee * 【core】 修复DateUtil.offset导致的时区错误问题issue#I1294O@Gitee

View File

@ -151,7 +151,8 @@ compile 'cn.hutool:hutool-all:4.6.7'
Hutool欢迎任何人为Hutool添砖加瓦贡献代码不过作者是一个强迫症患者为了照顾病人需要提交的prpull request符合一些规范规范如下 Hutool欢迎任何人为Hutool添砖加瓦贡献代码不过作者是一个强迫症患者为了照顾病人需要提交的prpull request符合一些规范规范如下
1. 注释完备尤其每个新增的方法应按照Java文档规范标明方法说明、参数说明、返回值说明等信息如果愿意也可以加上你的大名。 1. 注释完备尤其每个新增的方法应按照Java文档规范标明方法说明、参数说明、返回值说明等信息如果愿意也可以加上你的大名。
2. Hutool的缩进按照Eclipse不要跟我说IDEA多好用作者非常懒学不会默认tab缩进所以请遵守不要和我争执空格与tab的问题这是一个病人的习惯 2. Hutool的缩进按照Eclipse~~不要跟我说IDEA多好用作者非常懒学不会~~IDEA真香改了Eclipse快捷键后
舒服多了默认tab缩进所以请遵守不要和我争执空格与tab的问题这是一个病人的习惯
3. 新加的方法不要使用第三方库的方法Hutool遵循无依赖原则除非在extra模块中加方法工具 3. 新加的方法不要使用第三方库的方法Hutool遵循无依赖原则除非在extra模块中加方法工具
4. 请pull request到`v4-dev`分支。Hutool在4.x版本后使用了新的分支`v4-master`是主分支表示已经发布中央库的版本这个分支不允许pr也不允许修改。`v4-dev`分支是开发分支Hutool的下个版本或者SNAPSHOT版本在这个分支上开发你可以pr到这个分支。 4. 请pull request到`v4-dev`分支。Hutool在4.x版本后使用了新的分支`v4-master`是主分支表示已经发布中央库的版本这个分支不允许pr也不允许修改。`v4-dev`分支是开发分支Hutool的下个版本或者SNAPSHOT版本在这个分支上开发你可以pr到这个分支。

View File

@ -7,7 +7,7 @@ import cn.hutool.core.util.StrUtil;
* @author xiaoleilu * @author xiaoleilu
*/ */
public class CronException extends RuntimeException{ public class CronException extends RuntimeException{
private static final long serialVersionUID = 8247610319171014183L; private static final long serialVersionUID = 1L;
public CronException(Throwable e) { public CronException(Throwable e) {
super(e.getMessage(), e); super(e.getMessage(), e);

View File

@ -5,13 +5,17 @@ import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.log.Log; import cn.hutool.log.Log;
import cn.hutool.log.LogFactory; import cn.hutool.log.LogFactory;
import java.io.Serializable;
/** /**
* 定时任务计时器<br> * 定时任务计时器<br>
* 计时器线程每隔一分钟检查一次任务列表一旦匹配到执行对应的Task * 计时器线程每隔一分钟检查一次任务列表一旦匹配到执行对应的Task
* @author Looly * @author Looly
* *
*/ */
public class CronTimer extends Thread{ public class CronTimer extends Thread implements Serializable {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.get(); private static final Log log = LogFactory.get();
/** 定时单元:秒 */ /** 定时单元:秒 */

View File

@ -1,5 +1,6 @@
package cn.hutool.cron; package cn.hutool.cron;
import java.io.Serializable;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.TimeZone; import java.util.TimeZone;
@ -51,7 +52,9 @@ import cn.hutool.setting.Setting;
* @author Looly * @author Looly
* *
*/ */
public class Scheduler { public class Scheduler implements Serializable {
private static final long serialVersionUID = 1L;
private Lock lock = new ReentrantLock(); private Lock lock = new ReentrantLock();
/** 时区 */ /** 时区 */
@ -286,6 +289,16 @@ public class Scheduler {
return this; return this;
} }
/**
* 获取定时任务表注意此方法返回非复制对象对返回对象的修改将影响已有定时任务
*
* @return 定时任务表{@link TaskTable}
* @since 4.6.7
*/
public TaskTable getTaskTable() {
return this.taskTable;
}
/** /**
* 获得指定id的{@link CronPattern} * 获得指定id的{@link CronPattern}
* *

View File

@ -4,9 +4,10 @@ import cn.hutool.cron.task.Task;
/** /**
* 作业执行器<br> * 作业执行器<br>
* 执行具体的作业执行完毕销毁 * 执行具体的作业执行完毕销毁<br>
* @author Looly * 作业执行器唯一关联一个作业负责管理作业的运行的生命周期
* *
* @author Looly
*/ */
public class TaskExecutor implements Runnable { public class TaskExecutor implements Runnable {
@ -15,12 +16,19 @@ public class TaskExecutor implements Runnable{
/** /**
* 获得任务对象 * 获得任务对象
*
* @return 任务对象 * @return 任务对象
*/ */
public Task getTask() { public Task getTask() {
return task; return task;
} }
/**
* 构造
*
* @param scheduler 调度器
* @param task 被执行的任务
*/
public TaskExecutor(Scheduler scheduler, Task task) { public TaskExecutor(Scheduler scheduler, Task task) {
this.scheduler = scheduler; this.scheduler = scheduler;
this.task = task; this.task = task;

View File

@ -1,6 +1,8 @@
package cn.hutool.cron; package cn.hutool.cron;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import cn.hutool.cron.task.Task; import cn.hutool.cron.task.Task;
@ -9,21 +11,38 @@ import cn.hutool.cron.task.Task;
* 作业执行管理器<br> * 作业执行管理器<br>
* 负责管理作业的启动停止等 * 负责管理作业的启动停止等
* *
* <p>
* 此类用于管理正在运行的作业情况作业启动后加入任务列表任务结束移除
* </p>
*
* @author Looly * @author Looly
* @since 3.0.1 * @since 3.0.1
*/ */
public class TaskExecutorManager { public class TaskExecutorManager implements Serializable {
private static final long serialVersionUID = 1L;
protected Scheduler scheduler; protected Scheduler scheduler;
/** 执行器列表 */ /**
private List<TaskExecutor> executors = new ArrayList<>(); * 执行器列表
*/
private final List<TaskExecutor> executors = new ArrayList<>();
public TaskExecutorManager(Scheduler scheduler) { public TaskExecutorManager(Scheduler scheduler) {
this.scheduler = scheduler; this.scheduler = scheduler;
} }
/** /**
* 启动 TaskExecutor * 获取所有正在执行的任务调度执行器
*
* @return 任务执行器列表
* @since 4.6.7
*/
public List<TaskExecutor> getExecutors() {
return Collections.unmodifiableList(this.executors);
}
/**
* 启动 执行器TaskExecutor即启动作业
* *
* @param task {@link Task} * @param task {@link Task}
* @return {@link TaskExecutor} * @return {@link TaskExecutor}
@ -41,7 +60,7 @@ public class TaskExecutorManager {
} }
/** /**
* 执行器执行完毕调用此方法将执行器从执行器列表移除 * 执行器执行完毕调用此方法将执行器从执行器列表移除此方法由{@link TaskExecutor}对象调用用于通知管理器自身已完成执行
* *
* @param executor 执行器 {@link TaskExecutor} * @param executor 执行器 {@link TaskExecutor}
* @return this * @return this

View File

@ -1,5 +1,6 @@
package cn.hutool.cron; package cn.hutool.cron;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -9,11 +10,12 @@ import java.util.List;
* @author looly * @author looly
* *
*/ */
public class TaskLauncherManager { public class TaskLauncherManager implements Serializable {
private static final long serialVersionUID = 1L;
protected Scheduler scheduler; protected Scheduler scheduler;
/** 启动器列表 */ /** 启动器列表 */
protected List<TaskLauncher> launchers = new ArrayList<>(); protected final List<TaskLauncher> launchers = new ArrayList<>();
public TaskLauncherManager(Scheduler scheduler) { public TaskLauncherManager(Scheduler scheduler) {
this.scheduler = scheduler; this.scheduler = scheduler;

View File

@ -1,6 +1,9 @@
package cn.hutool.cron; package cn.hutool.cron;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
@ -15,18 +18,18 @@ import cn.hutool.cron.task.Task;
* 任务的添加移除使用读写锁保证线程安全性 * 任务的添加移除使用读写锁保证线程安全性
* *
* @author Looly * @author Looly
*
*/ */
public class TaskTable { public class TaskTable implements Serializable {
private static final long serialVersionUID = 1L;
private ReadWriteLock lock = new ReentrantReadWriteLock(); private ReadWriteLock lock = new ReentrantReadWriteLock();
private Scheduler scheduler; private Scheduler scheduler;
private TimeZone timezone; private TimeZone timezone;
private ArrayList<String> ids = new ArrayList<>(); private List<String> ids = new ArrayList<>();
private ArrayList<CronPattern> patterns = new ArrayList<>(); private List<CronPattern> patterns = new ArrayList<>();
private ArrayList<Task> tasks = new ArrayList<>(); private List<Task> tasks = new ArrayList<>();
private int size; private int size;
/** /**
@ -64,6 +67,54 @@ public class TaskTable {
return this; return this;
} }
/**
* 获取所有ID返回不可变列表即列表不可修改
*
* @return ID列表
* @since 4.6.7
*/
public List<String> getIds() {
final Lock readLock = lock.readLock();
try {
readLock.lock();
return Collections.unmodifiableList(this.ids);
} finally {
readLock.unlock();
}
}
/**
* 获取所有定时任务表达式返回不可变列表即列表不可修改
*
* @return 定时任务表达式列表
* @since 4.6.7
*/
public List<CronPattern> getPatterns() {
final Lock readLock = lock.readLock();
try {
readLock.lock();
return Collections.unmodifiableList(this.patterns);
} finally {
readLock.unlock();
}
}
/**
* 获取所有定时任务返回不可变列表即列表不可修改
*
* @return 定时任务列表
* @since 4.6.7
*/
public List<Task> getTasks() {
final Lock readLock = lock.readLock();
try {
readLock.lock();
return Collections.unmodifiableList(this.tasks);
} finally {
readLock.unlock();
}
}
/** /**
* 移除Task * 移除Task
* *

View File

@ -1,5 +1,6 @@
package cn.hutool.cron.listener; package cn.hutool.cron.listener;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -11,8 +12,10 @@ import cn.hutool.log.StaticLog;
* @author Looly * @author Looly
* *
*/ */
public class TaskListenerManager { public class TaskListenerManager implements Serializable {
private List<TaskListener> listeners = new ArrayList<>(); private static final long serialVersionUID = 1L;
private final List<TaskListener> listeners = new ArrayList<>();
/** /**
* 增加监听器 * 增加监听器
@ -45,9 +48,12 @@ public class TaskListenerManager {
public void notifyTaskStart(TaskExecutor executor) { public void notifyTaskStart(TaskExecutor executor) {
synchronized (listeners) { synchronized (listeners) {
int size = listeners.size(); int size = listeners.size();
TaskListener listener;
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
TaskListener listenerl = listeners.get(i); listener = listeners.get(i);
listenerl.onStart(executor); if(null != listener){
listener.onStart(executor);
}
} }
} }
} }

View File

@ -1,14 +1,22 @@
package cn.hutool.cron.task; package cn.hutool.cron.task;
/** /**
* 定时作业接口通过实现execute方法执行具体的任务<br> * 定时作业接口通过实现execute方法执行具体的任务
* @author Looly * <p>
* 作业执行是异步执行既不同作业相同作业在不同时间的执行是相互独立的<br>
* 假如前一个作业未完成下一个调度开始则不会等待前一个作业直接执行<br>
* 关于作业的互斥请自行加锁完成
* </p>
* *
* @author Looly
*/ */
public interface Task { public interface Task {
/** /**
* 执行作业 * 执行作业
* <p>
* 作业的具体实现需考虑异常情况默认情况下任务异常在监听中统一监听处理如果不加入监听异常会被忽略<br>
* 因此最好自行捕获异常后处理
*/ */
public void execute(); public void execute();
} }