新一代 Cron-Job分布式任务调度平台 部署指南

官方文档链接:部署文档

项目官网:Cron-Job 分布式任务调度平台

Gitee仓库:cron-job: cron-job,定时任务,分布式,任务调度平台,简单易用,超低延迟,支持用户权限管理,多语言客户端,多租户接入,分布式任务调度平台

GitHub仓库:GitHub - HoraceDH/cron-job: cron-job,定时任务,分布式,任务调度平台,简单易用,超低延迟,支持用户权限管理,多语言客户端,多租户接入,分布式任务调度平台


一、环境要求

  • OS:支持Linux、Windows、MacOS,文中以CentOS为例。
  • Java:1.8+,官方用的是:1.8.0_391,64位。
  • MySQL:5.7+,官方用的是: 5.7.35-log Source distribution。


二、发行版下载地址

  • 下载发行版
  • GitHub:https://github.com/HoraceDH/cron-job/releases
  • Gitee:https://gitee.com/HoraceDH/cron-job/releases
  • 解压文件,这里以gitee仓库为例,下载最新的版本,解压后会得到如下文件内容:
  • cronjob-examples:示例代码,可直接运行
  • 包含原生Java版本的 example-executor
  • SpringBoot版本的 example-executor-starter
  • cronjob-managerui:管理后台UI
  • cronjob-scheduler:调度器,负责任务调度的服务端
  • mysql.sql:完整的数据库初始化脚本

三、初始化数据库

  • 初始化SQL,找到mysql.sql文件,进入到MySQL命令行中,执行以下命令即可完成初始化,其中path替换为自己的路径:
source /path/mysql.sql
  • 成功后,会产生cron-job库,并包含如下表:

四、调度器服务端部署

1. 部署第一台实例

1.1 修改配置文件

  • 文件路径etc/application.properties:
############# 调度器配置 #############
# 用于标识实例的唯一性
server.id=1
############# 调度器配置 #############

############# 数据源配置 #############
database.url=jdbc:mysql://localhost:3306/cron-job?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
database.username=horace
database.password=SGJIWkjfdsof923847
############# 数据源配置 #############

############# Tomcat配置 #############
# Tomcat服务配置
server.port=9527
############# Tomcat配置 #############
  • 主要修改以下配置:
  • server.id:用于标识实例的唯一性,每个实例必须唯一。
  • server.port:服务端口,如果在同个机器部署,则需要修改端口,保证端口不冲突。
  • database.url:数据库连接地址。
  • database.username:数据库用户名。
  • database.password:数据库密码。

1.2 启动第一台实例

  • 执行命令:
sh start.sh
  • 查看日志输出,以下表示启动成功,有错则需要看日志排错,日志路径logs/app.log:
2025-02-18 17:28:24.427 INFO  [background-preinit]o.h.v.i.util.Version - HV000001: Hibernate Validator 6.2.0.Final
2025-02-18 17:28:24.432 INFO  [main]c.h.c.s.SchedulerMain - Starting SchedulerMain using Java 1.8.0_391 on HoraceiMacProMax.local with PID 4420 (/Users/horace/Downloads/cron-job-v1.0.1/cronjob-scheduler/cronjob-scheduler-1.0.1.jar started by horace in /Users/horace/Downloads/cron-job-v1.0.1/cronjob-scheduler)
2025-02-18 17:28:24.432 INFO  [main]c.h.c.s.SchedulerMain - No active profile set, falling back to 1 default profile: "default"
2025-02-18 17:28:25.276 INFO  [main]o.s.b.w.e.t.TomcatWebServer - Tomcat initialized with port(s): 9527 (http)
2025-02-18 17:28:25.283 INFO  [main]o.a.c.h.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-9527"]
2025-02-18 17:28:25.284 INFO  [main]o.a.c.c.StandardService - Starting service [Tomcat]
2025-02-18 17:28:25.284 INFO  [main]o.a.c.c.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.65]
2025-02-18 17:28:25.399 INFO  [main]o.a.c.c.C.[.[.[/] - Initializing Spring embedded WebApplicationContext
2025-02-18 17:28:25.399 INFO  [main]o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 932 ms
2025-02-18 17:28:25.822 INFO  [main]c.a.d.p.DruidDataSource - {dataSource-1} inited
2025-02-18 17:28:26.338 INFO  [main]c.h.c.s.s.i.SchedulerServiceImpl - find router strategy handler, name:randomRouterStrategyHandlerImpl, handler:cn.horace.cronjob.scheduler.strategy.RandomRouterStrategyHandlerImpl@431e86b1
2025-02-18 17:28:26.339 INFO  [main]c.h.c.s.s.i.SchedulerServiceImpl - find router strategy handler, name:shardingRouterStrategyHandlerImpl, handler:cn.horace.cronjob.scheduler.strategy.ShardingRouterStrategyHandlerImpl@5f36c8e3
2025-02-18 17:28:26.430 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - start statistics, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025
2025-02-18 17:28:26.432 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - end statistics, count:0, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025
2025-02-18 17:28:26.661 INFO  [main]o.a.c.h.Http11NioProtocol - Starting ProtocolHandler ["http-nio-9527"]
2025-02-18 17:28:26.684 INFO  [main]o.s.b.w.e.t.TomcatWebServer - Tomcat started on port(s): 9527 (http) with context path ''
2025-02-18 17:28:26.693 INFO  [main]c.h.c.s.SchedulerMain - Started SchedulerMain in 2.551 seconds (JVM running for 3.136)
2025-02-18 17:28:36.421 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - start statistics, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025
2025-02-18 17:28:36.423 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - end statistics, count:0, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025

2. 部署第N台实例

  • 拷贝一份cronjob-scheduler,作为第N台实例,按照第一台实例的方式修改配置文件即可。
  • 如若部署更多实例,按照第一台实例的做法,依次部署即可,注意修改server.id以及相关配置。

五、管理后台UI部署

1. 存放静态资源

管理后台UI可以在发布包中找到cronjob-managerui目录,将cronjob-managerui放到合适的目录下,该目录就是打包后的前端文件。

2. Nginx配置

参照如下模板配置即可,注意修改对应的信息:

upstream cron_job.server {
    # 配置多个调度器地址,用于负载均衡
    server 127.0.0.1:9527;
    server 127.0.0.1:9528;
}

server {
    listen  80;
    server_name 127.0.0.1;
    error_log   logs/127.0.0.1.error.log   error;
    access_log  logs/127.0.0.1.access.log  main;

    # 管理后台UI静态资源
    location / {
        # 用于配合ant.design browserHistory 使用
        try_files   $uri $uri/index.html /index.html;
        root    /Users/horace/Downloads/cron-job-v1.0.1/cronjob-managerui;
        index   index.html;
    }

    # 管理后台API接口
    location /manager-api {
        proxy_pass  http://cron_job.server;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    Host              $http_host;
        proxy_set_header    X-Real-IP         $remote_addr;
    }

    # 开放API接口
    location /openapi {
        proxy_pass  http://cron_job.server;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    Host              $http_host;
        proxy_set_header    X-Real-IP         $remote_addr;
    }
}

3. 启动Nginx

访问http://127.0.0.1,实际访问地址根据自身部署的站点情况调整,实际生产部署需要配置域名。

4. 登录任务调度平台

看到如下页面时,说明部署成功,输入账号密码 admin/admin 进入系统:

六、启动示例工程

1. 进入目录

进入
cronjob-examples/example-executor目录,并执行如下命令:

sh start.sh

2. 检查执行器日志

出现以下表示启动成功,其中cron job executor register success表示执行器注册成功,cron job task register success执行器任务注册成功。

2025-02-18 17:59:40.855 INFO  [main]c.h.c.e.s.TaskService - found cron job task, TaskConfig{tenant='horace', method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', name='普通测试任务', appName='example-executor', appDesc='普通示例执行器', tag='common', remark='', cron='* * * * * ? ', routerStrategy=1, expiredStrategy=2, expiredTime=180000, failureStrategy=2, timeout=10000, maxRetryCount=5, failureRetryInterval=5000}
2025-02-18 17:59:40.868 INFO  [cron-job-http-server]o.eclipse.jetty.util.log - Logging initialized @448ms to org.eclipse.jetty.util.log.Slf4jLog
2025-02-18 17:59:40.944 INFO  [cron-job-http-server]o.e.jetty.server.Server - jetty-9.4.48.v20220622; built: 2022-06-21T20:42:25.880Z; git: 6b67c5719d1f4371b33655ff2d047d24e171e49a; jvm 1.8.0_391-b13
2025-02-18 17:59:40.968 INFO  [cron-job-http-server]o.e.jetty.server.session - DefaultSessionIdManager workerName=node0
2025-02-18 17:59:40.969 INFO  [cron-job-http-server]o.e.jetty.server.session - No SessionScavenger set, using defaults
2025-02-18 17:59:40.970 INFO  [cron-job-http-server]o.e.jetty.server.session - node0 Scavenging every 600000ms
2025-02-18 17:59:40.978 INFO  [cron-job-http-server]o.e.j.s.h.ContextHandler - Started o.e.j.s.ServletContextHandler@688910fd{/,null,AVAILABLE}
2025-02-18 17:59:40.992 INFO  [cron-job-http-server]o.e.j.s.AbstractConnector - Started ServerConnector@69735139{HTTP/1.1, (http/1.1)}{192.168.16.51:8527}
2025-02-18 17:59:40.992 INFO  [cron-job-http-server]o.e.jetty.server.Server - Started @572ms
2025-02-18 17:59:40.992 INFO  [cron-job-http-server]c.h.c.e.h.HttpServer - cron job web server started, address:192.168.16.51:8527
2025-02-18 17:59:41.343 INFO  [scheduler-thread-1]c.h.c.e.s.OpenApiService - cron job executor register success, serverAddress:http://127.0.0.1, params:ExecutorRegisterParams{tenant='horace', appName='example-executor', appDesc='普通示例执行器', hostName='HoraceiMacProMax.local', tag='common', version='Java-1.0.1', address='192.168.16.51:8527'}, result:MsgObject{code=0, msg='', data=null}
2025-02-18 17:59:42.407 INFO  [scheduler-thread-1]c.h.c.e.s.OpenApiService - cron job task register success, address:192.168.16.51:8527, result:MsgObject{code=0, msg='', data=null}

3. 启动任务

  • 登录管理后台,点击任务管理,点击启动任务,即可开始任务的调度。

4. 查看调度日志

可以看到,任务的调度很准时!

2025-02-18 18:03:51.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791224381441, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873031000, receivedDispatcherTime=1739873028002, params=''}
2025-02-18 18:03:52.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791241158657, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873032000, receivedDispatcherTime=1739873029002, params=''}
2025-02-18 18:03:53.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791257935873, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873033000, receivedDispatcherTime=1739873030005, params=''}
2025-02-18 18:03:54.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791274713089, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873034000, receivedDispatcherTime=1739873031002, params=''}
2025-02-18 18:03:55.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791291490305, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873035000, receivedDispatcherTime=1739873032002, params=''}
2025-02-18 18:03:56.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791299878913, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873036000, receivedDispatcherTime=1739873033002, params=''}
2025-02-18 18:03:57.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791308267521, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873037000, receivedDispatcherTime=1739873034002, params=''}
2025-02-18 18:03:58.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791325044737, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873038000, receivedDispatcherTime=1739873035002, params=''}
2025-02-18 18:03:59.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791341821953, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873039000, receivedDispatcherTime=1739873036002, params=''}
2025-02-18 18:04:00.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791350210561, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873040000, receivedDispatcherTime=1739873037002, params=''}
2025-02-18 18:04:01.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791358599169, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873041000, receivedDispatcherTime=1739873038002, params=''}
2025-02-18 18:04:02.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791366987777, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873042000, receivedDispatcherTime=1739873039002, params=''}
2025-02-18 18:04:03.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791375376385, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873043000, receivedDispatcherTime=1739873040002, params=''}
2025-02-18 18:04:04.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791383764993, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873044000, receivedDispatcherTime=1739873041002, params=''}
2025-02-18 18:04:05.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791400542209, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873045000, receivedDispatcherTime=1739873042002, params=''}
2025-02-18 18:04:06.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791408930817, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873046000, receivedDispatcherTime=1739873043002, params=''}
2025-02-18 18:04:07.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791417319425, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873047000, receivedDispatcherTime=1739873044002, params=''}
2025-02-18 18:04:08.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791425708033, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873048000, receivedDispatcherTime=1739873045002, params=''}
2025-02-18 18:04:09.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791434096641, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873049000, receivedDispatcherTime=1739873046002, params=''}
2025-02-18 18:04:10.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791434100737, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873050000, receivedDispatcherTime=1739873047002, params=''}
2025-02-18 18:04:11.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791450873857, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873051000, receivedDispatcherTime=1739873048002, params=''}

5. 查看调度详情

至此,全部部署完成!

原文链接:,转发请注明来源!