任务调度系统调研

因为需要用到java系的调度系统,所以最近在调研。

国内的主要有xxl-job、saturn、quartz和sia-task,因为quartz有数据库锁的问题,saturn没有说明是否可以做任务依赖,所以初步选择xxl-job和sia-task。

xxl-job

github: https://github.com/xuxueli/xxl-job/

xxl-job部署非常方便,起mysql、起调度中心和执行器即可:

部署

mysql

docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

启动后初始化脚本在 /xxl-job/doc/db/tables_xxl_job.sql

调度中心和执行器

参考 https://www.xuxueli.com/xxl-job/#二、快速入门

使用

摘抄自:https://blog.csdn.net/hu_zhiting/article/details/83097799

Bean模式

原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHandler(value=“名称”)”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。

GLUE模式

原理:每个 “GLUE模式(Java)” 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。

执行器

执行器实际上是一个内嵌的Jetty服务器,默认端口9999(配置项:xxl.job.executor.port)。

在项目启动时,执行器会通过“@JobHandler”识别Spring容器中“Bean模式任务”,以注解的value属性为key管理起来。

“执行器”接收到“调度中心”的调度请求时,如果任务类型为“Bean模式”,将会匹配Spring容器中的“Bean模式任务”,然后调用其execute方法,执行任务逻辑。如果任务类型为“GLUE模式”,将会加载GLue代码,实例化Java对象,注入依赖的Spring服务,然后调用execute方法,执行任务逻辑。

sia-task

github:https://github.com/siaorg/sia-task

相对比较新,今年五月份开源的。

官网上docker的部署方式有问题,虚拟机部署方式也折腾了好久。

部署

mysql

docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

初始化:https://github.com/siaorg/sia-task/blob/master/DEPLOY.md

zookeeper

推荐是3节点的集群,这里做实验就部署一个节点。

docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper

启动后用client进去看看是否成功:
docker run -it --rm --link some-zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper

nodejs

brew install node

然后按照官网:

  • npm install 或 cnpm install(推荐) cnpm安装命令:npm install -g cnpm --registry=https://registry.npm.taobao.org
  • npm run build

nginx

nginx.conf按照https://github.com/siaorg/sia-task/blob/master/DEPLOY.md 配置,然后把资源指向上一步编出来的dist文件夹。

nginx -s reload

comments powered by Disqus