松哥也在微信群里和小伙伴们讨论过各自到底用的是 xxl-job 还是 ElasticJob,讨论的结果就是,xxl-job 使用的人更多一些。
为银川等地区用户提供了全套网页设计制作服务,及银川网站建设行业解决方案。主营业务为成都网站建设、成都网站设计、银川网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
不说功能的优劣,我们单纯从数据上其实就能看出一些端倪:
这是 xxl-job 的 GitHub:
这是 ElasticJob 的 GitHub:
从这个数据比较上大概也能看出来 xxl-job 更火一些。注意我这里说的是更火一些,不是说 xxl-job 比 ElasticJob 更强。
xxl-job 出自大众点评,这是一个分布式轻量级的任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
xxl-job 通过一个中心式的调度平台,调度多个执行器执行任务,调度中心通过 DB 锁保证集群分布式调度的一致性,这样扩展执行器会增大 DB 的压力,然而大部分公司的任务数,执行器并不多;xxl-job 提供了非常好用的监控页面甚至还有任务失败的邮件告警功能。不同于 ElasticJob,xxl-job 在使用时依赖 MySQL,而不需要 ZooKeeper。
ElasticJob 则出自当当,设计 ElasticJob 的初衷是为了面对高并发以及复杂的业务,即使是在业务量大,服务器多的时候也能做好任务调度,尽可能的利用服务器的资源。ElasticJob 是无中心化的,如果主服务器挂了,会自动通过 ZooKeeper 的选举机制选举出新的主服务器。因此 ElasticJob 具有良好的扩展性和可用性。
所以,你打算用哪个?
我们先把 xxl-job 跑起来,再写我们自己的代码。
首先我们先把 xxl-job 的代码搞下来,地址:
https://github.com/xuxueli/xxl-job
然后用 IDEA 打开项目,打开之后,有四个主要的文件夹:
由于 xxl-job 运行需要数据库,所以接下来我们就来配置数据库,先找到数据库脚本,在 doc/db/tables_xxl_job.sql 位置。
找到数据库脚本后,导入到数据库中执行一下,执行完成后,生成如下库和表:
接下来找到 xxl-job-admin/src/main/resources/application.properties 文件,修改数据库连接信息:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
日志配置也要修改一下,在 xxl-job-admin/src/main/resources/logback.xml 文件中,有如下一行:
如果你是 Windows 操作系统,这里肯定要改,如果你是 Mac 的话,也有可能没有这个目录的权限,因此我建议大家改一下这里的配置,改为如下这样:
改为在项目运行目录下生成这个日志文件。
修改完成后,接下来我们就可以启动 xxl-job-admin 项目了,这是一个 SpringBoot 项目,找到启动类,直接运行其 main 方法即可。
项目启动成功后,浏览器输入如下地址 http://localhost:8080/xxl-job-admin/toLogin,就可以看到登录页面了:
默认的登录账号是 admin/123456。
看到如下页面,就是登录成功了。
接下来我们来创建一个项目,跑一个定时任务看看。
首先创建一个 SpringBoot 项目,引入 Web 依赖,如下:
项目创建成功后,引入 xxl-job 的依赖:
com.xuxueli
xxl-job-core
2.3.0
然后在 resources 目录下加入 logback.xml,内容如下:
logback
%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
${log.path}
${log.path}.%d{yyyy-MM-dd}.zip
%date %level [%thread] %logger{36} [%file : %line] %msg%n
修改 application.properties 文件,内容如下:
# web port
server.port=8089
# 日志配置
logging.config=classpath:logback.xml
# 配置调度中心地址
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
# 执行器和调度中心之间的通信令牌,如果没有配置,表示关闭了通信令牌的校验。
# 在 xxl-job-admin 的配置文件中,有一个一模一样的配置项,两边都配置,就会进行校验。
xxl.job.accessToken=
# 配置执行器的名字
xxl.job.executor.appname=xxl-job-demo
# 执行器地址,如果没有配置,就使用 IP:PORT 作为默认值
xxl.job.executor.address=
# 执行器 ip 地址
xxl.job.executor.ip=
# 执行器端口,默认即 9999
xxl.job.executor.port=9999
# 执行器日志文件位置
xxl.job.executor.logpath=./applogs/xxl-job/jobhandler
# 执行器日志保存时间
xxl.job.executor.logretentiondays=30
各项配置的含义我已经加了注释了。
接下来再提供一个配置类,如下:
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
其实就是把刚刚 application.properties 中的属性都配置成一个 XxlJobSpringExecutor Bean,很奇怪官方为什么没把这个搞成一个自动化配置的 Bean。
接下来我们就可以创建一个具体的定时任务了。
对于我们 Java 工程师而言,有三种开发定时任务的方式。
Bean 模式任务,支持基于类的开发方式,每个任务对应一个 Java 类。
优点:不限制项目环境,兼容性好。即使是无框架项目,如 main 方法直接启动的项目也可以提供支持。
缺点:
开发方式:
XxlJobExecutor.registJobHandler("demoJobHandler", new DemoJobHandler());
这种方式用的不多,我就不给大家演示了,小伙伴们可以自行尝试。
Bean 模式任务,支持基于方法的开发方式,每个任务对应一个方法,一般推荐这种方式。
优点:
缺点:
基于方法开发的任务,底层会生成 JobHandler 代理,和基于类的方式一样,任务也会以 JobHandler 的形式存在于执行器任务容器中。
开发步骤:
@Component
public class MyJob {
@XxlJob("demoJobHandler")
public ReturnTdemoJobHandler() throws Exception {
String param = XxlJobHelper.getJobParam();
XxlJobHelper.log("XXL-JOB, Hello World:{}",param);
return ReturnT.SUCCESS;
}
}
这里的 @XxlJob 注解标记了这是一个定时任务方法,该注解还有 init 和 destroy 属性,可以分别用来配置初始化和销毁的方法。
XxlJobHelper.getJobParam() 可以用来获取任务参数。
在这个过程中,我们需要通过 XxlJobHelper.log 打印执行日志。
默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 XxlJobHelper.handleFail/handleSuccess 自主设置任务结果。
然后启动 SpringBoot 项目。
接下来打开配置调度中心,找到执行器管理,点击新增,如下:
如果是自动注册的话,可以不用填机器地址。
接下来找到任务管理,并点击新增:
基础配置都没啥好说的。
调度类型选择 CRON 表达式,CRON 表达式可以自己填,也可以点击后面的编辑按钮自动生成。
运行模式就选择 BEAN,JobHandler 的值就是我们前面 @XxlJob 注解中填的值,任务参数就是定时任务的方法参数。
配置完成后,回到执行器管理,点击查看,可以查看刚刚注册的节点信息:
再次回到任务管理,选择启动,就可以开始定时任务的执行了:
开启之后,点击调度日志,就可以看到我们系统任务执行的详细信息了:
可以看到,每隔 5 秒执行一次。
点击调度备注,可以查看一些调度细节:
在右边操作按钮中选择执行日志:
可以查看执行细节:
红色框出来的,就是我们刚刚自己打印的。
当然这里还有一些其他玩法,小伙伴们可以自行点击按钮尝试,我就不赘述了。
任务以源码方式维护在调度中心,支持通过 Web IDE 在线更新,实时编译和生效,因此不需要指定 JobHandler。即在网页上写定时任务的代码,然后去执行。
这种方式个人感觉使用较少,小伙伴们了解一下即可。
开发流程如下:
开发任务代码:选中指定任务,点击该任务右侧 GLUE 按钮,将会前往 GLUE 任务的 Web IDE 界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑中)。
编辑完成后,保存即可。接下来又和前面一样了,启动任务,后查看调度日志。
这里支持 30 个版本的版本回溯,在 GLUE 任务的 Web IDE 界面,选择右上角下拉框“版本回溯”,会列出该 GLUE 的更新历史,选择相应版本即可显示该版本代码,保存后 GLUE 代码即回退到对应的历史版本。
本文标题:xxl-job Vs ElasticJob,谁牛?
转载来源:http://www.shufengxianlan.com/qtweb/news4/547654.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联