snail-job简介
SnailJob是一个任务调度和任务重试平台。而且它本身已经拥有完善的权限管理、强大的告警监控功能和友好的界面交互。相较其他的任务调度平台,它拥有任务重试的独特能力。下面是与其他开源组件的对比:
| 项目 | Quartz | Elastic-Job | XXL-JOB | PowerJob | Snail Job |
|---|---|---|---|---|---|
| 定时调度 | Cron | Cron | Cron | CRON、固定频率、固定延迟、OpenAPI | 1. 定时任务 2. 秒级任务(无需依赖外部中间件) 3. 固定频率 4.OpenAPI(开发中) |
| 重试任务 | 不支持 | 不支持 | 不支持 | 不支持 | 1.支持本地&远程重试模式 2.支持各种常用组件的重试 比如dubbo/feign 3.支持多种退避策略 4.丰富的重试风暴管控手段 ...... |
| 任务编排 | 不支持 | 不支持 | 不支持 | 支持 | 仿钉钉工作流设计,颜值高、体验好 |
| 分布式计算 | 不支持 | 静态分片 | 广播 | 支持 | 1. 广播执行 2. 集群执行 3. 静态分片 4. 动态分片(开发中) |
| 多语言 | Java | 1. 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版本。项目结构如下:
| 目录名称 | 见名识意 |
|---|---|
| doc | 文档目录。这里还包括docker编排、初始化数据库的sql。 |
| snail-job-client | 客户端的核心代码。包括定时任务和重试任务的核心代码 |
| snail-job-client-starter | 客户端和springboot集成的starter。处理一些自动配置 |
| snail-job-common | 客户端和服务器端都要用到的通用代码。 |
| snail-job-datasource | 服务端用到的数据源 |
| snail-job-server | 服务端代码。 |
由于这节是要启动服务端,所以对其更深入一层了解一下snail-job-server模块下包括哪些内容:
| 目录名称 | 见名识意 |
|---|---|
| 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。
可以使用数据库工具Navicat或者DBeaver把snail_job_mysql.sql文件执行。
修改数据库连接配置
由于上面初识目录结构中说过,snail-job-server-starter是服务端启动模块。所以这里就要修改它的配置文件。
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中启动
通过上面启动类在idea中进行启动。
打包为jar后,通过命令启动
通过Maven的package进行打包,会在
snail-job-server-starter模块下的target中出现snail-job-server-exec.jar包然后就可以在JDK>=17的机器上执行命令启动:
java -jar snail-job-server-exec.jar
管理页-设置命名空间和组
服务端启动后,便可以访问服务端管理页面了。
- url:http://localhost:8080/snail-job
- 用户名/密码:admin/admin
设置命名空间
命名空间这里先简单的理解为开发环境。比如:dev、test、prod等环境。
- 命名空间唯一标识要和客户端配置文件中的 snail-job.namespace 值保持一致
在命名空间页面点击新增按钮
新增完成后,切换默认空间为dev空间。
设置组管理
组可以简单理解为针对某个项目、应用的一类定时都放在一组中,方便任务集中管理。
- 组名称需要和客户端配置文件中snail-job.group的值一致
- Token需要和客户端配置文件中snail-job.token的值一致
客户端启动
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("定时任务执行成功");
}
}管理页-调度任务
查看客户端机器
启动客户端程序后,可以通过在线机器查看到启动的这个客户端。
创建定时任务
由于这个我们没有设置其他内容,默认是1分钟后调用客户端程序。这时可以在客户端的控台中看到信息:
增加任务参数并手动执行任务
保存后,手动执行任务。
客户端可以看到参数值
总结
- 服务端必须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初体验 整理
如有侵权,请联系作者 马铃薯头 删除















