# super-scheduled
**Repository Path**: dingjunjun_codeSpace/super-scheduled
## Basic Information
- **Project Name**: super-scheduled
- **Description**: SpringBoot的定时调用的加强工具,实现定时任务动态管理,后续加入可视化管理、调度日志、集群任务统一管理
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 76
- **Created**: 2022-09-18
- **Last Updated**: 2022-09-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringBoot的定时任务动态管理
SpringBoot的定时任务的加强工具,实现定时任务动态管理,完全兼容原生@Scheduled注解,无需对原本的定时任务进行修改
## 引入jar包
```xml
com.github.guoyixing
spring-boot-starter-super-scheduled
0.3.4
```
## 原理说明
[https://blog.csdn.net/qq_34886352/article/details/106494637](https://blog.csdn.net/qq_34886352/article/details/106494637)
## 配置参数
### 1.配置定时任务线程池(不配置时采用默认参数)
```properties
#线程池大小
spring.super.scheduled.thread-pool.poolSize=30
#线程名前缀
spring.super.scheduled.thread-pool.threadNamePrefix=super
#设置是否关闭时等待执行中的任务执行完成
spring.super.scheduled.thread-pool.waitForTasksToCompleteOnShutdown=false
#设置此执行器被关闭时等待的最长时间,用于在其余容器继续关闭之前等待剩余任务执行完成
#需要将waitForTasksToCompleteOnShutdown设置为true,此配置才起作用
spring.super.scheduled.thread-pool.awaitTerminationSeconds=0
```
### 2.扩展插件配置
```properties
#开启执行标志
spring.super.scheduled.plug-in.executionFlag=true
#开启定时任务调度日志,日志文件是存在本地磁盘上的
spring.super.scheduled.plug-in.executionLog=true
#日志存放位置,不设置默认位置为程序同级目录下
spring.super.scheduled.plug-in.logPath=H:/tmp/log-scheduled
#开启基于zookeeper的集群模式
spring.super.scheduled.plug-in.colony=true
#zookeeper集群模式的定时任务服务名,相同名称的定时任务名称服务会被统一管理
spring.super.scheduled.plug-in.colonyName=test
```
### 3.zookeeper配置
```properties
#设置zookeeper地址,zookeeper集群多个地址用英文逗号隔开
spring.super.scheduled.zookeeper.url=127.0.0.1:2181
#设置zookeeper session超时时间
spring.super.scheduled.zookeeper.sessionTimeout=60000
#设置zookeeper连接超时时间
spring.super.scheduled.zookeeper.connectionTimeout=60000
```
## 使用样例
### 1.正常使用springScheduled
```java
@SpringBootApplication
@EnableScheduling
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
```
```java
@Component
public class TestTask {
private DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Scheduled(cron = "0/2 * * * * ?")
public void robReceiveExpireTask() {
System.out.println(df.format(LocalDateTime.now()) + "测试测试");
}
}
```
### 2.定时任务动态管理
```java
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationTests {
//直接注入管理器
@Autowired
private SuperScheduledManager superScheduledManager;
@Test
public void test() {
//获取所有定时任务
List allSuperScheduledName = superScheduledManager.getAllSuperScheduledName();
String name = allSuperScheduledName.get(0);
//终止定时任务
superScheduledManager.cancelScheduled(name);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务名:" + name);
//启动定时任务
superScheduledManager.addCronScheduled(name, "0/2 * * * * ?");
//获取启动汇总的定时任务
List runScheduledName = superScheduledManager.getRunScheduledName();
runScheduledName.forEach(System.out::println);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//修改定时任务执行周期
superScheduledManager.setScheduledCron(name, "0/5 * * * * ?");
}
}
```
### 3.管理器功能
#### 3.1 获取所有定时任务
```java
List allSuperScheduledName = superScheduledManager.getAllSuperScheduledName();
```
#### 3.1 获取所有启动的定时任务
```java
List runScheduledName = superScheduledManager.getRunScheduledName();
```
#### 3.2 终止定时任务
```java
superScheduledManager.cancelScheduled(name);
```
#### 3.3 cron类型操作
```java
//以cron模式启动定时任务
superScheduledManager.addCronScheduled(name, "0/2 * * * * ?");
//将定时任务转为cron模式运行,并修改cron的参数值
superScheduledManager.setScheduledCron(name, "0/2 * * * * ?");
```
#### 3.4 FixedRate类型操作
```java
//以FixedRate模式启动定时任务
//上一次开始执行之后2秒后再执行,首次运行延迟1秒
superScheduledManager.addFixedRateScheduled(name, 2000L,1000L);
//首次运行不进行延迟
superScheduledManager.addFixedRateScheduled(name, 2000L);
//将定时任务转为FixedRate模式运行,并修改执行间隔的参数值
superScheduledManager.setScheduledFixedRate(name, 2000L);
```
#### 3.5 FixedDelay类型操作
```java
//以FixedDelay模式启动定时任务
//上一次执行完毕之后2秒后再执行,首次运行延迟1秒
superScheduledManager.addFixedDelayScheduled(name, 2000L,1000L);
//首次运行不进行延迟
superScheduledManager.addFixedDelayScheduled(name, 2000L);
//将定时任务转为FixedDelay模式运行,并修改执行间隔的参数值
superScheduledManager.setScheduledFixedDelay(name, 2000L);
```
#### 3.6 手动执行一次
```java
superScheduledManager.runScheduled(name);
```
#### 3.7 获取日志文件信息
```java
superScheduledManager.getScheduledLogFiles();
```
#### 3.8 获取日志信息
```java
superScheduledManager.getScheduledLogs(fileName);
```
#### 3.9 结束正在执行中的任务,跳过这次运行
**只有在每个前置增强器结束之后才会判断是否需要跳过此次运行**
```java
superScheduledManager.callOffScheduled(name);
```
### 4.Api接口
#### 4.1 获取所有定时任务
`GET` /scheduled/name/all
#### 4.2 获取启动的定时任务
`GET` /scheduled/name/run
#### 4.3 手动执行一次任务
`POST` /scheduled/{name}/run
#### 4.4 终止定时任务
`DELETE` /scheduled/{name}
#### 4.5 cronApi
##### 4.5.1 以cron类型启动Scheduled
`POST` /scheduled/cron/{name}/add
参数:`text` \[cron\]
##### 4.5.2 将定时任务转为cron模式运行,并修改cron的参数值
`POST` /scheduled/cron/{name}/set
参数:`text` \[cron\]
#### 4.6 fixedDelayApi
##### 4.6.1 以FixedDelay模式启动定时任务
`POST` /scheduled/fixedDelay/{name}/add/{fixedDelay}/{initialDelay}
##### 4.6.2 以FixedDelay模式启动定时任务(不延迟)
`POST` /scheduled/fixedDelay/{name}/add/{fixedDelay}
##### 4.6.3 将定时任务转为FixedDelay模式运行,并修改执行间隔的参数值
`POST` /scheduled/fixedDelay/{name}/set/{fixedDelay}
#### 4.7 fixedRateApi
##### 4.7.1 以FixedRate模式启动定时任务
`POST` /scheduled/fixedRate/{name}/add/{fixedRate}/{initialDelay}
##### 4.7.2 以FixedRate模式启动定时任务(不延迟)
`POST` /scheduled/fixedRate/{name}/add/{fixedRate}
##### 4.7.3 将定时任务转为FixedRate模式运行,并修改执行间隔的参数值
`POST` /scheduled/fixedRate/{name}/set/{fixedRate}
#### 4.8 获取日志文件信息
`GET` /scheduled/log/files
#### 4.9 获取日志信息
`GET` /scheduled/log/{fileName}
#### 4.10 结束正在执行中的任务,跳过这次运行
**只有在每个前置增强器结束之后才会判断是否需要跳过此次运行**
`POST` /scheduled/{name}/callOff
### 5.扩展接口
#### 5.1 扩展样例
1. 将类注入到spring容器中
2. 实现BaseStrengthen接口
3. 使用@SuperScheduledOrder(int)注解实现执行优先级控制,int值越大优先级越高,默认值为0
```java
@Component
@SuperScheduledOrder(1)
public class Strong implements BaseStrengthen {
/**
* 前置强化方法
*
* @param bean bean实例(或者是被代理的bean)
* @param method 执行的方法对象
* @param args 方法参数
* @param context 任务线程运行时的上下文
*/
@Override
public void before(Object bean, Method method, Object[] args, ScheduledRunningContext context) {
System.out.println("定时任务执行前运行");
}
/**
* 后置强化方法
*
* @param bean bean实例(或者是被代理的bean)
* @param method 执行的方法对象
* @param args 方法参数
* @param context 任务线程运行时的上下文
*/
@Override
public void after(Object bean, Method method, Object[] args, ScheduledRunningContext context) {
System.out.println("定时任务执行成功后运行");
}
/**
* 异常强化方法
*
* @param bean bean实例(或者是被代理的bean)
* @param method 执行的方法对象
* @param args 方法参数
* @param context 任务线程运行时的上下文
*/
@Override
public void exception(Object bean, Method method, Object[] args, ScheduledRunningContext context) {
System.out.println("定时任务执行异常时运行");
}
/**
* Finally强化方法,出现异常也会执行
*
* @param bean bean实例(或者是被代理的bean)
* @param method 执行的方法对象
* @param args 方法参数
* @param context 任务线程运行时的上下文
*/
@Override
public void afterFinally(Object bean, Method method, Object[] args, ScheduledRunningContext context) {
System.out.println("定时任务执行完成后运行(异常时也运行)");
}
}
```
#### 5.2 更多样例
更多样例参考:
执行标记增强器:com.gyx.superscheduled.core.RunnableInterceptor.strengthen.ExecutionFlagStrengthen
执行日志增强器:com.gyx.superscheduled.core.RunnableInterceptor.strengthen.LogStrengthen
### 6.集群模式
#### 6.1基于zookeeper的集群模式
部署多服务的时候,会限制定时任务的执行,防止同一个任务在多个服务上反复运行
`目前不支持设置的指定的定时任务`
`目前不支持统一的动态管理,只能单个逐一设置`
##### 6.1.1开启zk集群模式
```
spring.super.scheduled.plug-in.colony=true
#设置zookeeper地址,zookeeper集群多个地址用英文逗号隔开
spring.super.scheduled.zookeeper.url=127.0.0.1:2181
#设置zookeeper session超时时间,默认值为60秒
spring.super.scheduled.zookeeper.sessionTimeout=60000
#设置zookeeper连接超时时间,默认值为60秒
spring.super.scheduled.zookeeper.connectionTimeout=60000
```
## 版本更新
### 0.1.0版
* 只兼容原生@Scheduled注解cron属性
### 0.2.0版
* 完全兼容原生@Scheduled注解
### 0.2.1版
* 完善Manager功能
* 修复大量bug
### 0.3.0版
* 添加api接口
* 添加定时任务线程池配置
### 0.3.1版
* 添加扩展接口
### 0.3.2版
* 添加定时任务调度日志
### 0.3.3版
* 添加任务线程运行时上下文
* 添加跳过当前执行任务的能力
* 添加扩展类的执行优先级
### 0.3.4版
* 添加基于zookeeper的集群模式
* 修复跳过单次运行产生的bug
## 后续计划
* 后续加入可视化管理
* 集群任务统一管理