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
* 【core】 FileUtil.normalize在win下支持samba路径issue#549@Github
* 【core】 修复Validator注释错误pr#70@Gitee
* 【cron】 添加获取任务表的方法issue#I12E5H@Gitee
### Bug修复
* 【core】 修复DateUtil.offset导致的时区错误问题issue#I1294O@Gitee

View File

@ -151,7 +151,8 @@ compile 'cn.hutool:hutool-all:4.6.7'
Hutool欢迎任何人为Hutool添砖加瓦贡献代码不过作者是一个强迫症患者为了照顾病人需要提交的prpull request符合一些规范规范如下
1. 注释完备尤其每个新增的方法应按照Java文档规范标明方法说明、参数说明、返回值说明等信息如果愿意也可以加上你的大名。
2. Hutool的缩进按照Eclipse不要跟我说IDEA多好用作者非常懒学不会默认tab缩进所以请遵守不要和我争执空格与tab的问题这是一个病人的习惯
2. Hutool的缩进按照Eclipse~~不要跟我说IDEA多好用作者非常懒学不会~~IDEA真香改了Eclipse快捷键后
舒服多了默认tab缩进所以请遵守不要和我争执空格与tab的问题这是一个病人的习惯
3. 新加的方法不要使用第三方库的方法Hutool遵循无依赖原则除非在extra模块中加方法工具
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
*/
public class CronException extends RuntimeException{
private static final long serialVersionUID = 8247610319171014183L;
private static final long serialVersionUID = 1L;
public CronException(Throwable e) {
super(e.getMessage(), e);

View File

@ -5,15 +5,19 @@ import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import java.io.Serializable;
/**
* 定时任务计时器<br>
* 计时器线程每隔一分钟检查一次任务列表一旦匹配到执行对应的Task
* @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 long TIMER_UNIT_SECOND = DateUnit.SECOND.getMillis();
/** 定时单元:分 */

View File

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

View File

@ -4,28 +4,36 @@ import cn.hutool.cron.task.Task;
/**
* 作业执行器<br>
* 执行具体的作业执行完毕销毁
* @author Looly
* 执行具体的作业执行完毕销毁<br>
* 作业执行器唯一关联一个作业负责管理作业的运行的生命周期
*
* @author Looly
*/
public class TaskExecutor implements Runnable{
public class TaskExecutor implements Runnable {
private Scheduler scheduler;
private Task task;
/**
* 获得任务对象
*
* @return 任务对象
*/
public Task getTask() {
return task;
}
/**
* 构造
*
* @param scheduler 调度器
* @param task 被执行的任务
*/
public TaskExecutor(Scheduler scheduler, Task task) {
this.scheduler = scheduler;
this.task = task;
}
@Override
public void run() {
try {
@ -34,7 +42,7 @@ public class TaskExecutor implements Runnable{
scheduler.listenerManager.notifyTaskSucceeded(this);
} catch (Exception e) {
scheduler.listenerManager.notifyTaskFailed(this, e);
}finally{
} finally {
scheduler.taskExecutorManager.notifyExecutorCompleted(this);
}
}

View File

@ -1,6 +1,8 @@
package cn.hutool.cron;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import cn.hutool.cron.task.Task;
@ -8,23 +10,40 @@ import cn.hutool.cron.task.Task;
/**
* 作业执行管理器<br>
* 负责管理作业的启动停止等
*
*
* <p>
* 此类用于管理正在运行的作业情况作业启动后加入任务列表任务结束移除
* </p>
*
* @author Looly
* @since 3.0.1
*/
public class TaskExecutorManager {
public class TaskExecutorManager implements Serializable {
private static final long serialVersionUID = 1L;
protected Scheduler scheduler;
/** 执行器列表 */
private List<TaskExecutor> executors = new ArrayList<>();
/**
* 执行器列表
*/
private final List<TaskExecutor> executors = new ArrayList<>();
public TaskExecutorManager(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}
* @return {@link TaskExecutor}
*/
@ -41,8 +60,8 @@ public class TaskExecutorManager {
}
/**
* 执行器执行完毕调用此方法将执行器从执行器列表移除
*
* 执行器执行完毕调用此方法将执行器从执行器列表移除此方法由{@link TaskExecutor}对象调用用于通知管理器自身已完成执行
*
* @param executor 执行器 {@link TaskExecutor}
* @return this
*/
@ -55,7 +74,7 @@ public class TaskExecutorManager {
/**
* 停止所有TaskExecutor
*
*
* @return this
* @deprecated 作业执行器只是执行给定的定时任务线程无法强制关闭可通过deamon线程方式关闭之
*/

View File

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

View File

@ -1,6 +1,9 @@
package cn.hutool.cron;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TimeZone;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
@ -13,25 +16,25 @@ import cn.hutool.cron.task.Task;
* 定时任务表<br>
* 任务表将ID表达式任务一一对应定时任务执行过程中会周期性检查定时任务表中的所有任务表达式匹配情况从而执行其对应的任务<br>
* 任务的添加移除使用读写锁保证线程安全性
*
* @author Looly
*
* @author Looly
*/
public class TaskTable {
public class TaskTable implements Serializable {
private static final long serialVersionUID = 1L;
private ReadWriteLock lock = new ReentrantReadWriteLock();
private Scheduler scheduler;
private TimeZone timezone;
private ArrayList<String> ids = new ArrayList<>();
private ArrayList<CronPattern> patterns = new ArrayList<>();
private ArrayList<Task> tasks = new ArrayList<>();
private List<String> ids = new ArrayList<>();
private List<CronPattern> patterns = new ArrayList<>();
private List<Task> tasks = new ArrayList<>();
private int size;
/**
* 构造
*
*
* @param scheduler {@link Scheduler}
*/
public TaskTable(Scheduler scheduler) {
@ -41,10 +44,10 @@ public class TaskTable {
/**
* 新增Task
*
* @param id ID
*
* @param id ID
* @param pattern {@link CronPattern}
* @param task {@link Task}
* @param task {@link Task}
* @return this
*/
public TaskTable add(String id, CronPattern pattern, Task task) {
@ -64,9 +67,57 @@ public class TaskTable {
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
*
*
* @param id Task的ID
*/
public void remove(String id) {
@ -84,11 +135,11 @@ public class TaskTable {
writeLock.unlock();
}
}
/**
* 更新某个Task的定时规则
*
* @param id Task的ID
*
* @param id Task的ID
* @param pattern 新的表达式
* @return 是否更新成功如果id对应的规则不存在则不更新
* @since 4.0.10
@ -110,7 +161,7 @@ public class TaskTable {
/**
* 获得指定位置的{@link Task}
*
*
* @param index 位置
* @return {@link Task}
* @since 3.1.1
@ -127,7 +178,7 @@ public class TaskTable {
/**
* 获得指定id的{@link Task}
*
*
* @param id ID
* @return {@link Task}
* @since 3.1.1
@ -142,7 +193,7 @@ public class TaskTable {
/**
* 获得指定位置的{@link CronPattern}
*
*
* @param index 位置
* @return {@link CronPattern}
* @since 3.1.1
@ -159,7 +210,7 @@ public class TaskTable {
/**
* 任务表大小加入的任务数
*
*
* @return 任务表大小加入的任务数
* @since 4.0.2
*/
@ -169,7 +220,7 @@ public class TaskTable {
/**
* 任务表是否为空
*
*
* @return true为空
* @since 4.0.2
*/
@ -179,7 +230,7 @@ public class TaskTable {
/**
* 获得指定id的{@link CronPattern}
*
*
* @param id ID
* @return {@link CronPattern}
* @since 3.1.1
@ -194,7 +245,7 @@ public class TaskTable {
/**
* 如果时间匹配则执行相应的Task带读锁
*
*
* @param millis 时间毫秒
*/
public void executeTaskIfMatch(long millis) {
@ -209,7 +260,7 @@ public class TaskTable {
/**
* 如果时间匹配则执行相应的Task无锁
*
*
* @param millis 时间毫秒
* @since 3.1.1
*/

View File

@ -1,5 +1,6 @@
package cn.hutool.cron.listener;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@ -11,8 +12,10 @@ import cn.hutool.log.StaticLog;
* @author Looly
*
*/
public class TaskListenerManager {
private List<TaskListener> listeners = new ArrayList<>();
public class TaskListenerManager implements Serializable {
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) {
synchronized (listeners) {
int size = listeners.size();
TaskListener listener;
for (int i = 0; i < size; i++) {
TaskListener listenerl = listeners.get(i);
listenerl.onStart(executor);
listener = listeners.get(i);
if(null != listener){
listener.onStart(executor);
}
}
}
}

View File

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