snail-job简介

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

项目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

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

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

设置命名空间

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

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

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

image-20240911084907712

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

image-20240911085330415

设置组管理

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

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

image-20240911090610206

客户端启动

Snail Job 要求客户端≥JDK17,SpringBoot3.X。但是还有一个兼容JDK8的版本。这里以JDK8的版本为例进行测试。不过还是建议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≥JDK17。客户端有针对JDK8的版本。
  • 服务端不管是通过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 月 29 日
温柔的好天气总是和我一样,帅的鸭皮!