{"id":29631136,"url":"https://github.com/llllllxy/tiny-job","last_synced_at":"2026-05-04T20:33:49.877Z","repository":{"id":203644579,"uuid":"709865125","full_name":"llllllxy/tiny-job","owner":"llllllxy","description":"一个基于SpringBoot+Quartz开发的轻量级分布式任务调度管理系统","archived":false,"fork":false,"pushed_at":"2024-04-23T10:06:53.000Z","size":3800,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-04-24T06:38:57.047Z","etag":null,"topics":["java","job","quartz","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/llllllxy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-10-25T14:48:16.000Z","updated_at":"2024-04-26T06:23:55.288Z","dependencies_parsed_at":null,"dependency_job_id":"9551e2e7-3a02-4be8-bc15-5e763daa5fa7","html_url":"https://github.com/llllllxy/tiny-job","commit_stats":null,"previous_names":["llllllxy/tiny-job"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/llllllxy/tiny-job","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llllllxy%2Ftiny-job","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llllllxy%2Ftiny-job/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llllllxy%2Ftiny-job/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llllllxy%2Ftiny-job/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/llllllxy","download_url":"https://codeload.github.com/llllllxy/tiny-job/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llllllxy%2Ftiny-job/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266287824,"owners_count":23905461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","job","quartz","spring-boot"],"created_at":"2025-07-21T11:08:18.145Z","updated_at":"2026-05-04T20:33:49.872Z","avatar_url":"https://github.com/llllllxy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tiny Job\n# 轻量级分布式定时任务调度系统\n![SpringBoot](https://img.shields.io/badge/springboot-2.6.11-green.svg?style=flat-square)\n\u003ca href=\"https://github.com/llllllxy/tiny-job/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/llllllxy/tiny-job?style=flat-square\u0026logo=GitHub\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/llllllxy/tiny-job/network/members\"\u003e\u003cimg src=\"https://img.shields.io/github/forks/llllllxy/tiny-job?style=flat-square\u0026logo=GitHub\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/llllllxy/tiny-job/watchers\"\u003e\u003cimg src=\"https://img.shields.io/github/watchers/llllllxy/tiny-job?style=flat-square\u0026logo=GitHub\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/llllllxy/tiny-job/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/llllllxy/tiny-job.svg?style=flat-square\u0026logo=GitHub\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/llllllxy/tiny-job/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/llllllxy/tiny-job.svg?style=flat-square\"\u003e\u003c/a\u003e\n\u003ca href='https://gitee.com/leisureLXY/tiny-job/stargazers'\u003e\u003cimg src='https://gitee.com/leisureLXY/tiny-job/badge/star.svg?theme=dark' alt='star'\u003e\u003c/img\u003e\u003c/a\u003e\n\u003ca href='https://gitee.com/leisureLXY/tiny-job/members'\u003e\u003cimg src='https://gitee.com/leisureLXY/tiny-job/badge/fork.svg?theme=dark' alt='fork'\u003e\u003c/img\u003e\u003c/a\u003e\n\n\u003e 一个基于SpringBoot+Quartz的的轻量级分布式定时任务调度系统\n\n\n## 主要技术选型\n\n1、后端：\n- SpringBoot 2.7.18\n- Quartz 2.3.2\n- Mybatis-Plus 3.5.7\n- Httpclient 4.5.13\n\n2、前端：\n- Layui 2.8.11\n- jQuery 2.1.4\n\n## 运行环境\n- Jdk8\n- MySQL5.6+\n\n## 运行启动教程\n1. 新建`MySQL`数据库并导入`sql`文件夹下的数据库脚本\n2. 修改配置文件中`application.yml`中数据库连接信息\n3. 运行启动类`TinyJobApplication`，即可正常启动项目\n4. 管理后台登录地址：`http://localhost:9009`  账户密码 `admin / 123456`\n\n## 功能特色\n### 1. 项目维度管理：任务与主机的结构化归类\n- 引入「项目」核心概念，将分散的主机信息、定时任务按业务场景或团队归属进行分组管理，避免资源混乱\n- 支持项目级别的权限隔离（后续规划），为不同团队或业务线提供独立的任务调度空间，数据边界清晰\n\n\n### 2. 主机管理：灵活可控的执行器集群配置\n- 支持单主机多地址维护（如 `http://172.89.56.117:8899`、`http://172.89.56.118:8899`），轻松构建执行器集群\n- 集成安全调用策略（待完善），通过签名校验等机制保障任务请求的合法性，防止未授权调用\n- 提供 **7种路由负载均衡策略**，并预留标准化扩展接口，满足不同场景下的任务分发需求：\n  - FIRST（固定首地址）：始终选择集群中第一个可用主机\n  - LAST（固定尾地址）：始终选择集群中最后一个可用主机\n  - ROUND（轮询）：按顺序循环分配任务，确保各主机负载均衡\n  - RANDOM（随机）：随机选择可用主机，适用于无明显负载差异的场景\n  - LFU（最不经常使用）：优先分配任务给调用频率最低的主机，优化资源利用率\n  - LRU（最近最久未使用）：优先分配任务给长时间未调用的主机，避免单点过载\n  - CONSISTENT_HASH（一致性哈希）：基于哈希算法固定任务与主机的映射关系，减少任务漂移\n\n\n### 3. 任务管理：可视化、高灵活的调度配置\n- 全在线操作：支持任务的新增、编辑、删除、手动触发执行，以及实时启停\n- 多触发器类型：同时支持 **CRON表达式**（复杂时间规则，如“每周一凌晨3点”）和 **SIMPLE触发器**（固定秒数间隔，如“每5秒执行一次”）\n- 丰富的任务参数配置：\n  - 请求层：支持 `GET`/`POST`/`POST_JSON` 三种请求类型，可自定义请求路径（与主机地址自动拼接）、请求参数（JSON格式）、请求头（JSON格式）\n  - 调度层：\n    - **调度过期处理规则**：针对“任务触发时因系统故障/主机离线导致未执行”的场景，提供3种处理策略：\n      - 立即执行：补执行所有错过的未执行任务（如系统宕机1小时，重启后一次性执行这1小时内所有应触发的任务），适用于“数据同步类”需补全数据的场景；\n      - 执行一次：仅补执行1次最近错过的任务，且从当前时间重新计算下次触发时间（如每10分钟执行1次，宕机30分钟后重启，仅执行1次，下次按重启时间+10分钟触发），适用于“通知类”避免重复推送的场景；\n      - 放弃执行（默认）：忽略所有错过的未执行任务，直接从当前时间开始计算下次触发时间（如每小时执行1次，宕机2小时后重启，下次按重启时间+1小时触发），适用于“实时性要求低”无需补执行的场景；\n    - **并发执行控制**：支持两种执行模式，适配不同任务特性：\n      - 允许并发：同一任务的前一次执行未结束时，若到达下一次触发时间，直接启动新的执行进程（如任务执行耗时15秒，触发间隔10秒，会同时存在2个执行进程），适用于“无状态、可并行”的任务（如多节点数据独立查询）；\n      - 禁止并发（单机串行）：同一任务的前一次执行未结束时，阻塞下一次触发（需等前一次执行完成后，再判断是否触发下一次任务），避免因并发导致的数据冲突（如任务操作同一数据库表，并发执行可能引发锁表/数据不一致）；\n- 内置CRON表达式生成器：可视化配置时间规则，无需手动编写复杂表达式，降低使用门槛\n\n\n### 4. 任务执行日志：安全可追溯的调度记录\n- 完整记录任务执行信息：包括执行时间、执行主机、请求参数、响应结果、执行状态（成功/失败）、耗时等，问题排查更高效\n- 日志安全保护：采用国密SM3算法对日志内容进行签名，确保日志未被篡改，满足数据完整性校验需求\n\n\n### 5. 预警配置：任务异常的及时感知\n- 支持预警邮箱配置，当任务执行失败（如请求超时、返回错误码）时，系统自动发送告警邮件，及时通知运维人员处理，减少故障影响范围\n\n## 平台功能界面展示\n首页\n![首页](tiny-job-admin/src/main/resources/static/images/readme/首页.png)\n\n项目管理\n![项目管理](tiny-job-admin/src/main/resources/static/images/readme/项目管理.png)\n\n项目管理-编辑\n![项目管理-编辑](tiny-job-admin/src/main/resources/static/images/readme/项目管理-编辑.png)\n\n主机管理\n![主机管理](tiny-job-admin/src/main/resources/static/images/readme/主机管理.png)\n\n主机管理-编辑\n![主机管理-编辑](tiny-job-admin/src/main/resources/static/images/readme/主机管理-编辑.png)\n\n任务管理\n![任务管理](tiny-job-admin/src/main/resources/static/images/readme/任务管理.png)\n\n任务管理-编辑\n![项目管理-编辑](tiny-job-admin/src/main/resources/static/images/readme/任务管理-编辑.png)\n\n任务日志\n![任务日志](tiny-job-admin/src/main/resources/static/images/readme/任务日志.png)\n\nCRON生成\n![CRON生成](tiny-job-admin/src/main/resources/static/images/readme/CRON生成.png)\n\n\n## 执行器主机安全策略配置\n待完成\n\n# 项目计划\n| 功能模块       | 状态       | 说明                                                                                   |\n|------------|------------|--------------------------------------------------------------------------------------|\n| Mock核心功能   | ✅ 已完成   | 提供接口Mock能力，支持模拟任务请求的返回结果，便于调试                                                        |\n| 项目管理       | ✅ 已完成   | 实现项目的创建、编辑、删除，以及任务/主机与项目的关联                                                          |\n| 接口管理       | ✅ 已完成   | 管理任务关联的接口信息，支持接口参数、请求方式等配置                                                           |\n| 接口修改历史     | ✅ 已完成   | 记录接口配置的修改日志，支持回溯历史版本，便于问题定位                                                          |\n| 接口访问日志     | ✅ 已完成   | 记录接口的调用记录，包括调用时间、调用者、请求参数、响应结果等                                                      |\n| 邀请码注册      | ✅ 已完成   | 通过邀请码机制控制注册权限，保障系统访问安全                                                               |\n| 首页大屏       | ✅ 已完成   | 可视化展示下的任务执行概况、主机状态、异常统计等核心数据                                                         |\n| 数据统计页面     | ✅ 已完成   | 提供任务执行成功率、主机负载、接口调用量等统计图表，辅助运营决策                                                     |\n| 项目成员协作功能   | ✅ 已完成   | 支持多成员协作管理同一项目，实现权限共享（基础版）                                                            |\n| 项目导出/导入    | ✅ 已完成   | 支持项目级数据的备份（导出）与恢复（导入），便于环境迁移或数据备份                                                    |\n| 自定义头像修改    | ✅ 已完成   | 支持/用户自定义头像，提升系统个性化体验                                                                 |\n| 接口分模块管理    | 📅️ 待完成   | 支持接口按业务模块分组管理，适用于接口数量较多的复杂项目                                                         |\n| 主机节点监控与上下线 | ✅ 已完成  | 内置定时监控任务，主动检测主机存活状态，实现故障节点自动下线、恢复后上线                                                 |\n| 角色与权限管理    | 📅 待完成   | 区分管理员、操作员等角色，支持按项目维度分配权限（如“仅查看任务”“可编辑任务”）                                            |\n| 任务失败告警增强   | 📅 待完成   | 增加webhook告警（如企业微信机器人、钉钉机器人、自建告警平台），支持自定义告警URL、请求体格式                                  |\n| 任务回调功能     | 📅 待完成   | 添加任务执行成功/失败回调功能，任务结束后回调到任务中心[JobClient.handleSuccess(msg)，JobClient.handleFail(msg) ] | \n| 主机自动注册     | 📅 待完成   | 通过继承 tinyjob-client 来实现主机自动注册功能                                                      |\n| 广播任务       | 📅 待完成   |                                                        |\n\n## 常用cron表达式示例\n- 0/2 * * * * ?   表示每2秒 执行任务\n\n- 0 0/2 * * * ?   表示每2分钟 执行任务\n\n- 0 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务\n\n- 0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业\n\n- 0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作\n\n- 0 0 10,14,16 * * ?   每天上午10点，下午2点，4点\n\n- 0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时\n\n- 0 0 12 ? * WED    表示每个星期三中午12点\n\n- 0 0 12 * * ?   每天中午12点触发\n\n- 0 15 10 ? * *    每天上午10:15触发\n\n- 0 15 10 * * ?     每天上午10:15触发\n\n- 0 15 10 * * ?    每天上午10:15触发\n\n- 0 15 10 * * ? 2005    2005年的每天上午10:15触发\n\n- 0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发\n\n- 0 0/5 14 * * ?    在每天下午2点到下午2:55期间的每5分钟触发\n\n- 0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发\n\n- 0 0-5 14 * * ?    在每天下午2点到下午2:05期间的每1分钟触发\n\n- 0 10,44 14 ? 3 WED    每年三月的星期三的下午2:10和2:44触发\n\n- 0 15 10 ? * MON-FRI    周一至周五的上午10:15触发\n\n- 0 15 10 15 * ?    每月15日上午10:15触发\n\n- 0 15 10 L * ?    每月最后一日的上午10:15触发\n\n- 0 15 10 ? * 6L    每月的最后一个星期五上午10:15触发\n\n- 0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发\n\n- 0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllllllxy%2Ftiny-job","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fllllllxy%2Ftiny-job","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllllllxy%2Ftiny-job/lists"}