# 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 ## 插件式任务调度器 > 不重启项目,通过一个触发条件,执行一段代码逻辑 - 这个触发条件可以来自时间,来自其他系统调用/中间件的消息事件,钩子等~~~~ - 这段逻辑代码可动态加载、启动、停止、移除 ### 任务调度算法 **使用时间轮分时调度,算法模型为** ![输入图片说明](https://images.gitee.com/uploads/images/2021/0310/005106_6748b2bb_4928216.png "屏幕截图.png") 时间轮默认单位为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 卸载/停用任务