mirror of
https://gitee.com/dromara/hutool.git
synced 2025-05-06 13:48:00 +08:00
add getTaskTable
This commit is contained in:
parent
46fd3912d4
commit
8d51e2343d
@ -13,6 +13,7 @@
|
|||||||
* 【system】 增加SystemPropsKeys(issue#550@Github)
|
* 【system】 增加SystemPropsKeys(issue#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)
|
||||||
|
@ -151,7 +151,8 @@ compile 'cn.hutool:hutool-all:4.6.7'
|
|||||||
Hutool欢迎任何人为Hutool添砖加瓦,贡献代码,不过作者是一个强迫症患者,为了照顾病人,需要提交的pr(pull request)符合一些规范,规范如下:
|
Hutool欢迎任何人为Hutool添砖加瓦,贡献代码,不过作者是一个强迫症患者,为了照顾病人,需要提交的pr(pull 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到这个分支。
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
|
||||||
/** 定时单元:秒 */
|
/** 定时单元:秒 */
|
||||||
|
@ -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}
|
||||||
*
|
*
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user