# jw-job-schedule
**Repository Path**: sdmq/jw-job-schedule
## Basic Information
- **Project Name**: jw-job-schedule
- **Description**: 动态定时任务,插件式定时任务调度器
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 11
- **Created**: 2023-04-02
- **Last Updated**: 2023-04-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 插件式任务调度器
> 不重启项目,通过一个触发条件,执行一段代码逻辑
- 这个触发条件可以来自时间,来自其他系统调用/中间件的消息事件,钩子等~~~~
- 这段逻辑代码可动态加载、启动、停止、移除
### 任务调度算法
**使用时间轮分时调度,算法模型为**

时间轮默认单位为1s,可自行设置其他精度
### 功能点
- 从本地或者网络中通过URL加载jar包执行调度
- 从字符串js脚本执行调度
- 从字符串java代码执行调度
### 要点
**解决插件中jar包冲突和同类冲突**
> 使用类隔离机制,为每个jar包使用不同的类加载器进行加载
### 加载jar包插件
引入plugin依赖
```xml
demo.jiawei
job-schedule-plugin
1.0.0-SNAPSHOT
```
或者直接把在项目plugin目录下jar包添加到插件中
开发插件:实现 `corn.task.plugin.Task` 接口的 `void doRun()` 方法,当插件任务满足调度条件时`doRun()`将会被执行
```java
/**
* 定义一个UserTask类,实现Task接口
* 一个jar包中可有多个Task的实现,均会被加载
*/
public class UserTask implements Task {
@Override
public void doRun() {
System.out.println("我是任务 2......");
//do something....
System.out.println("任务 2 结束......");
}
}
```
打包插件:
在插件的pom中引入`assembly`依赖打包插件
```xml
maven-assembly-plugin
jar-with-dependencies
```
使用`maven -> plugins -> assembly:assembly`连同依赖打成jar包
执行加载
```java
//使用 URLTaskResourceLoader 对jar包进行加载,可从http或本地加载
JarResourceLoader loader = new JarResourceLoader("D:\\temp\\tasks-01.jar", ResourceType.LOCAL);
//加载资源
loader.load();
//创建触发器调度器
TriggerScheduler triggerScheduler = new TriggerScheduler(new TimeWheel().start());
//遍历所有插件中的实现类
for (Task instance : loader.loadTaskInstance("corn.task.UserTask", "corn.task.UserTask2")) {
//注册定时任务
String id = triggerScheduler.register(instance, TriggerType.FIX_RATE, 8);
//使能任务
triggerScheduler.enable(id);
}
//卸载jar包
loader.unload();
```
### 加载(java字符串/.java文本) 插件
```java
String className = "plugin.MyClass";
String javaCode = "import cron.task.plugin.Task;\n" +
"public class MyClass implements Task {\n" +
" public void doRun() {\n" +
" System.out.println(\"Hello World\");\n" +
" }\n" +
"}\n";
//创建一个java字符串加载器
JavaStrTaskResourceLoader loader = new JavaStrTaskResourceLoader(className, javaCode);
//动态编译获取字节码实例
Task[] instances = loader.loadTaskInstance(className);
TriggerScheduler triggerScheduler = new TriggerScheduler(new TimeWheel().start());
for (Task instance : instances) {
String id = triggerScheduler.register(instance, TriggerType.FIX_RATE, 8);
triggerScheduler.enable(id);
}
```
### 加载(js字符串/.js文本) 插件
```java
String js = "function doRun(){ java.lang.System.out.println(\"执行完成\"); }";
JStrTaskResourceLoader loader = new JStrTaskResourceLoader(js);
///
```
### 使用task-admin操作调度规则
在引入依赖`job-schedule-core`后
```xml
demo.jiawei
job-schedule-core
1.0.0-SNAPSHOT
```
使用上述加载插件的方式加载,并启动项目,访问[http://localhost:1466](http://localhost:1466),即可打开控制台使用 admin | willianfu 登录
#### 任务管理
新增任务
更新调度corn
卸载/停用任务