# SimpleScheduler **Repository Path**: dpf371/SimpleScheduler ## Basic Information - **Project Name**: SimpleScheduler - **Description**: 基于Spring boot的简单任务调度器,限用于Oracle。 一个任务表可以支持多个应用节点同时调度任务。 - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-06-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # simple-scheduler #### 介绍 基于 Spring Boot 的简单任务调度器,限用于Oracle。 该工程编译成jar,以基础组件的角色存在,适用于缺乏分布式任务调度支持或者消息中间件支持的开发者。 角色作用等价于消息中间件(eg.kafka)的queue模式起到的作用。 #### 软件架构 ##### 设计思路 1. 任务调度由若干个过程组成,依次为: - 读取任务 - 锁定任务 - 执行任务 2. 对于执行超时的任务要有被再次执行的机会,这就需要一个重置任务状态的守护者角色。 3. 执行完的任务要定期清理,否则影响任务表的读写效率,这就需要一个自动清理任务的角色。 ##### 角色 1. 任务加载者(TaskLoader线程) 加载=读取+锁定(锁定是为了防止任务被同时执行多次) 根据Task的status决定是否读取并锁定,只读取status='未开始'的Task。 至于是否由当前应用节点锁定,就要由任务筛选策略来决定了(目前提供了默认策略和ID Hash策略,筛选策略可扩展)。 锁定的Task,状态置为‘待执行’,并被提交到WorkerGroup线程池。 2. 任务执行者(WorkerGroup线程池) 任务执行者收到TaskLoader分配的Task后,先检查Task是否已过期,未过期就将Task的状态改为‘执行中’,并执行Task,执行完再将Task的状态改为‘已执行’或者‘执行异常’。 3. 重置任务状态的巡逻兵(TaskResetSentinel线程) 定期扫描执行超时的Task,将其状态恢复为‘未开始’。给执行超时的Task一个再次被执行的机会。 4. 清洁工(TaskCleaner线程) 自动清理‘已执行’状态的任务,将超过指定期限(默认7天)之前就已经执行完的任务删除。 #### 样板工程使用说明 1. 首先在自己的 Oracle 中运行样板工程simple-scheduler-sample下的sql文件夹下的2个sql脚本,创建好任务表和节点信息表。 2. 然后执行 insertOneTask.sql 在任务表中新增一条任务,也可以自行手动添加若干条。 3. 最后运行 SimpleScheduleSampleApplication.java 的 main 函数即可看到运行日志。 simple-scheduler的使用者只需要以jar的形式将该任务调度器添加到自己的应用中,然后根据sample中的MyTaskInvoker的写法,自定义一个TaskInvoker的实现类,即可实现自己的业务上下游的异步交互/任务调度了。 #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)