Snail Job 简介

Snail Job 是一个任务调度和任务重试平台。而且它本身已经拥有完善的权限管理、强大的告警监控功能和友好的界面交互。相较其他的任务调度平台,它拥有任务重试的独特能力。下面是与其他开源组件的对比:

项目QuartzElastic-JobXXL-JOBPowerJobSnail Job
定时调度CronCronCronCRON、固定频率、固定延迟、OpenAPI1. 定时任务 2. 秒级任务(无需依赖外部中间件)3. 固定频率 4. OpenAPI(开发中)
重试任务不支持不支持不支持不支持1. 支持本地 & 远程重试模式 2. 支持各种常用组件的重试 比如 Dubbo/Feign 3. 支持多种退避策略 4. 丰富的重试风暴管控手段 ......
任务编排不支持不支持不支持支持仿钉钉工作流设计,颜值高、体验好
分布式计算不支持静态分片广播支持1. 广播执行 2. 集群执行 3. 静态分片 4. 动态分片(开发中)
多语言Java1. Java 2. 脚本任务1. Java 2. 脚本任务支持1. Java(已支持)2. 脚本任务(开发中)3. HTTP 任务(开发中)4. Kettle(开发中)
用户管理不支持支持支持不支持完备的用户管理和权限管理
安全 Token不支持不支持支持不支持支持
可视化1. 历史记录 2. 运行日志(不支持存储)3. 监控大盘支持1. 历史记录 2. 实时日志(支持持久化、可视化)3. 监控大盘(实时调度数据展示)4. 失败调度排名 5. 在线集群查看等
可运维启用、禁用任务1. 启用、禁用任务 2. 手动运行任务 3. 停止任务支持1. 启用、禁用任务 2. 手动运行任务 3. 停止任务 4. 手动重试
报警监控邮件邮件邮件支持配置多种告警场景,通知方式支持:1. 邮件 2. 钉钉 3. 企微 4. 飞书 5. Webhook
性能每次调度通过 DB 抢锁,对 DB 压力大ZooKeeper 是性能瓶颈采用 Master 节点调度,Master 节点压力大无锁化设计系统采用多 Bucket 模式,借助负载均衡算法,确保每个节点能够均衡处理任务,同时支持无限水平扩展,轻松应对海量任务调度
接入成本只依赖 DB 接入成本低需引入 ZooKeeper 增加系统复杂性和维护成本只依赖 DB 接入成本低依赖 DB 接入成本低只依赖 DB 接入成本低

官网地址:Snail Job 文档

初体验目标

本文主要目标包括:

  • 把任务后台启动起来
  • 通过任务后台管理页面,进行基本配置,并大概了解配置项的基本作用
  • 编写一个简单的客户端程序,实现任务调度时,打印参数信息
总而言之就是把整个 Snail Job 跑起来。通过这个过程,大概了解开发者使用者需要做的事情有哪些。

服务端启动

初识目录结构

JDK 版本要求是 >= 17。这里为了更好的查看项目目录结构,采用在 IDEA 中下载源码的方式启动项目。

项目克隆地址:Snail Job Gitee 仓库

我这里下载到的版本是:1.1.2 版本。项目结构如下:

image-20240910153029195

目录名称见名识意
doc文档目录。这里还包括 Docker 编排、初始化数据库的 SQL。
snail-job-client客户端的核心代码。包括定时任务和重试任务的核心代码
snail-job-client-starter客户端和 SpringBoot 集成的 Starter。处理一些自动配置
snail-job-common客户端和服务器端都要用到的通用代码。
snail-job-datasource服务端用到的数据源
snail-job-server服务端代码。

由于这节是要启动服务端,所以对其更深入一层了解一下 snail-job-server 模块下包括哪些内容:

image-20240910160548595

目录名称见名识意
snail-job-server-common服务端通用模块
snail-job-server-job-task服务端针对定时任务的模块
snail-job-server-retry-task服务端针对重试任务的模块
snail-job-server-starter服务端启动模块
snail-job-server-ui服务端管理页面模块【snail-job-admin 项目编译后内容】
snail-job-server-web服务端管理页面对应的请求接口模块


初始化数据库

我这里采用 MySQL 数据库为例。在 snail-job/doc/sql 目录下找到对应的数据库初始 SQL。

image-20240910162710468

可以使用数据库工具 Navicat 或者 DBeaver 把 snail_job_mysql.sql 文件执行。

修改数据库连接配置

由于上面初识目录结构中说过,snail-job-server-starter 是服务端启动模块。所以这里就要修改它的配置文件。

image-20240910163446591

spring:
  main:
    banner-mode: off
  profiles:
    active: dev
  datasource:
    name: snail_job
    ## MySQL
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 数据库的 URL
    url: jdbc:mysql://local:3306/snail_job?useSSL=false&characterEncoding=utf8&useUnicode=true
    # 数据库的用户名
    username: root
    # 数据库用户的密码
    password: root

启动服务端

  • 在 IDEA 中启动

    image-20240910164152169

    通过上面启动类在 IDEA 中进行启动。

  • 打包为 jar 后,通过命令启动

    image-20240910164348079

    通过 Maven 的 package 进行打包,会在 snail-job-server-starter 模块下的 target 中出现 snail-job-server-exec.jar

    image-20240910164640340

    然后就可以在 JDK >= 17 的机器上执行命令启动:

    java -jar snail-job-server-exec.jar

管理页-设置命名空间和组

服务端启动后,便可以访问服务端管理页面了。

  • URL:http://localhost:8080/snail-job
  • 用户名 / 密码:admin/admin

设置命名空间

命名空间这里先简单的理解为开发环境。比如:devtestprod 等环境。

  • 命名空间唯一标识要和客户端配置文件中的 snail-job.namespace 值保持一致

在命名空间页面点击 新增 按钮

image-20240911084907712

新增完成后,切换默认空间为 dev 空间。

image-20240911085330415

设置组管理

组可以简单理解为针对某个项目、应用的一类定时都放在一组中,方便任务集中管理。

  • 组名称需要和客户端配置文件中 snail-job.group 的值一致
  • Token 需要和客户端配置文件中 snail-job.token 的值一致

image-20240911090610206

客户端启动

Snail Job 要求客户端 ≥ JDK 17SpringBoot 3.X。但是还有一个兼容 JDK 8 的版本。这里以 JDK 8 的版本为例进行测试。不过还是建议 JDK 用 17 以上的。

Maven 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.18</version>
    </dependency>
    <!-- Snail Job 客户端启动依赖 -->
    <dependency>
        <groupId>com.aizuda</groupId>
        <artifactId>snail-job-client-starter</artifactId>
        <version>1.1.0-jdk8-beta1</version>
    </dependency>
    <!-- Snail Job 重试相关依赖 -->
    <dependency>
        <groupId>com.aizuda</groupId>
        <artifactId>snail-job-client-retry-core</artifactId>
        <version>1.1.0-jdk8-beta1</version>
    </dependency>
    <!-- Snail Job 客户端核心依赖 -->
    <dependency>
        <groupId>com.aizuda</groupId>
        <artifactId>snail-job-client-job-core</artifactId>
        <version>1.1.0-jdk8-beta1</version>
    </dependency>
</dependencies>

配置文件

server:
  port: 8888
snail-job:
  server:
    # 服务端的地址,若服务端集群部署则此处配置域名
    host: 127.0.0.1
    # 服务端 Netty 的端口号
    port: 1788
  # 名称空间 ID,和上面管理页中设置的命名空间中的唯一标识一致
  namespace: xd6NSI6-GGm634HVQOa2_1BRVi6nlG4x
  # 组名,和上面管理页中设置的组名一致
  group: service_plat
  # 令牌,和上面管理页中设置的组中 Token 一致
  token: SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj

启动加注解

@EnableSnailJob
@SpringBootApplication
public class TestSnailJobApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestSnailJobApplication.class, args);
    }
}
注意:这里要加 @EnableSnailJob,否则无法执行定时任务。

测试类

@Slf4j
@Component
public class TestSnailJobWithAbstractClass extends AbstractJobExecutor {
    @Override
    protected ExecuteResult doJobExecute(JobArgs jobArgs) {
        log.info("定时任务执行成功。参数值:{}", jobArgs);
        return ExecuteResult.success("定时任务执行成功");
    }
}

管理页-调度任务

查看客户端机器

启动客户端程序后,可以通过 在线机器 查看到启动的这个客户端。

image-20240911105121953

创建定时任务

image-20240911111503332

由于这个我们没有设置其他内容,默认是 1 分钟后调用客户端程序。这时可以在客户端的控制台中看到信息:

image-20240911142442186

增加任务参数并手动执行任务

image-20240911143231800

保存后,手动执行任务。

image-20240911143455573

客户端可以看到参数值

image-20240911143605311

总结

  • 服务端必须 JDK ≥ 17。客户端有针对 JDK 8 的版本。
  • 服务端不管是通过 mvn 直接打包,还是通过 IDEA 进行打包最终可以运行的 jar

    Snail-job/snail-job-server/snail-job-server-starter/target/snail-job-server-exec.jar

  • 命名空间可以简单理解为开发环境;客户端的 snail-job.namespace 配置的唯一值与之对应
  • 组可以简单理解为项目或者应用;组名对应 snail-job.group,令牌对应 snail-job.token
  • 客户端的 SpringBoot 启动类上要有注解:@EnableSnailJob
  • 客户端的定时任务要继承 AbstractJobExecutor

    补充说明:

    虽然还可以通过注解方式来定义一个定时任务。但是个人感觉容易重名。所以这里仅仅通过继承类,配置全路径名的方式来做。


本笔记原文来自博主 老马 9527 的文章 1.snail-job 初体验
如有侵权,请联系作者 马铃薯头 删除
最后修改:2025 年 10 月 30 日
温柔的好天气总是和我一样,帅的鸭皮!