当前位置: 首页 > 后端技术 > Java

xxl-jobVSElasticJob,谁更好?

时间:2023-04-01 19:10:49 Java

@[toc]前两天写了一篇文章介绍ElasticJob。很多朋友强烈建议聊聊xxl-job。其实ElasticJob本来就是入门的。宋哥本来是想跟大家分享xxl-job的。job的(手动狗头。1.xxl-job宋哥也在微信群里和朋友讨论过是用xxl-job还是ElasticJob,讨论的结果是用xxl-job的人多了,优势就不说了以及功能的劣势,其实我们可以简单的从数据中看出一些端倪:这是xxl-job的GitHub:这是ElasticJob的GitHub:从这个数据的对比,我们大概可以看出xxl-job更受欢迎注意,我这里说的比较通俗,并不是说xxl-job比ElasticJob强,xxl-job来自大众点评,是一个分布式轻量级的任务调度框架,其核心设计目标是开发快速,学习简单,轻量级,且易于扩展,xxl-job通过一个中心调度平台调度多个executor执行任务,调度中心通过DB锁保证集群分布式调度的一致性,所以扩展executor会增加DB中的任务数量大多数公司没有很多执行人;xxl-job提供了非常有用的监控页面,甚至还有任务失败的邮件报警功能。与ElasticJob不同,xxl-job依赖MySQL,不需要ZooKeeper。ElasticJob来自当当网。设计ElasticJob的初衷是为了面对高并发和复杂的业务。即使在业务量大,服务器多的情况下,也能做好任务调度,尽量使用服务器。资源。ElasticJob是去中心化的。如果主服务器挂掉了,它会通过ZooKeeper的选举机制自动选举出一个新的主服务器。因此,ElasticJob具有很好的可扩展性和可用性。那么,您打算使用哪一个?2.运行xxl-job我们先运行xxl-job,然后再写自己的代码。首先我们把xxl-job的代码弄下来,地址:https://github.com/xuxueli/xx...然后用IDEA打开工程。打开后主要有四个文件夹:doc:项目文档xxl-job-admin:任务调度平台xxl-job-core:核心代码xxl-job-executor-samples:case由于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/Shanghaispring.datasource.username=rootspring.datasource.password=123spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver的日志配置也要修改,在xxl-job-admin/src/main/resources/logback.xml文件中,有如下一行:如果你是Windows操作系统,这里一定要改。如果你是Mac,你可能没有这个目录的权限,所以我建议Let'schangetheconfigurationhere,改成如下:改为在项目运行目录下生成这个日志文件。修改完成后,我们就可以启动xxl-job-admin项目了,它是一个SpringBoot项目。找到启动类,直接运行它的main方法。项目启动成功后,在浏览器中输入如下地址http://localhost:8080/xxl-job-admin/toLogin,即可看到登录页面:默认登录账号为admin/123456。当看到如下页面时,登录成功。3.开发计划任务3.1项目的创建和配置下面我们来创建一个项目并运行一个计划任务来看看。首先创建一个SpringBoot项目,引入Web依赖,如下:项目创建成功后,引入xxl-job的依赖:com.xuxuelixxl-job-core2.3.0然后在resources目录下添加logback.xml,内容如下:logback%d{HH:mm:ss.SSS}%上下文名称[%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端口server.port=8089#日志配置logging.config=classpath:logback.xml#配置调度中心地址xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin#执行者与调度中心的通信token,如果没有配置,表示关闭通信token的验证#在xxl-job-admin的配置文件中,有一个相同的配置项,双方配置的,都会被验证。xxl.job.accessToken=#配置executor的名字xxl.job.executor.appname=xxl-job-demo#Executor地址,如果不配置,使用IP:PORT作为默认值xxl.job.executor.address=#Executorip地址xxl.job.executor.ip=#Executor端口,默认9999xxl.job.executor.port=9999#Executor日志文件位置xxl.job.executor.logpath=./applogs/xxl-job/jobhandler#Executorlogretentiontimexxl.job.executor.logretentiondays=30每个配置的含义我都加了注释。接下来再提供一个配置类,如下:@ConfigurationpublicclassXxlJobConfig{privateLoggerlogger=LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")privateStringadminAddresses;@Value("${xxl.job.accessToken}")privateStringaccessToken;@Value("${xxl.job.executor.appname}")privateStringappname;@Value("${xxl.job.executor.address}")私有字符串地址;@Value("${xxl.job.executor.ip}")privateStringip;@Value("${xxl.job.executor.port}")私有int端口;@Value("${xxl.job.executor.logpath}")privateStringlogPath;@Value("${xxl.job.executor.logretentiondays}")privateintlogRetentionDays;@BeanpublicXxlJobSpringExecutorxxlJobExecutor(){logger.info(">>>>>>>>>>>>xxl-job配置初始化。");XxlJobSpringExecutorxxlJobSpring执行器=新的XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(地址);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(端口);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor。设置日志路径(日志路径);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);返回xxlJobSpringExecutor;}}其实就是把刚才application.properties中的所有属性配置成一个XxlJobSpringExecutorBean。奇怪为什么官方没有把这个做成自动配置的Bean。接下来我们就可以创建具体的定时任务了。3.2定时任务的开发方式对于我们Java工程师来说,定时任务的开发方式有3种。3.2.1BEAN模式(类形式)Bean模式任务支持基于类的开发,每个任务对应一个Java类。优点:不限制项目环境,兼容性好。即使是无框架的项目,比如直接启动main方法的项目,也可以提供支持。缺点:每个任务需要占用一个Java类,造成类的浪费;不支持自动扫描任务并注入到执行器容器中,需要手动注入。开发方法:开发一个继承自com.xxl.job.core.handler.IJobHandler的JobHandler类,实现task方法。通过以下方式手动注入执行器容器:XxlJobExecutor.registJobHandler("demoJobHandler",newDemoJobHandler());在调度中心新建调度任务(后续步骤与3.2.1BEAN方式(方法形式)一致)。这个方法用的不多,就不给大家演示了,大家可以自己试试。3.2.2BEAN模式(方法形式)Bean模式任务支持基于方法的开发方式,每个任务对应一个方法,一般推荐使用。优点:每个任务只需要开发一个方法,可以加上“@XxlJob”注解,更方便快捷。支持自动扫描任务并注入执行器容器。缺点:需要Spring容器环境。对于基于方法的任务,底层会生成一个JobHandler代理。和基于类的方法一样,任务也会以JobHandler的形式存在于executor任务容器中。开发步骤:开发作业方法:@ComponentpublicclassMyJob{@XxlJob("demoJobHandler")publicReturnTdemoJobHandler()throwsException{Stringparam=XxlJobHelper.getJobParam();XxlJobHelper.log("XXL-JOB,HelloWorld:{}",param);返回ReturnT.SUCCESS;}}这里的@XxlJob注解标明这是一个定时任务方法,注解还有init和destroy属性,可以分别配置初始化和销毁??方法。XxlJobHelper.getJobParam()可用于获取作业参数。在这个过程中,我们需要通过XxlJobHelper.log来打印执行日志。默认任务结果为“成功”,无需主动设置;如果有请求,比如设置任务结果失败,可以通过XxlJobHelper.handleFail/handleSuccess独立设置任务结果。然后启动SpringBoot项目。配置调度中心,新建调度任务接下来打开配置调度中心,找到执行器管理,点击添加,如下:如果是自动注册,机器地址可以不用填写。接下来找到任务管理,点击添加:基本配置没什么好说的。调度类型选择CRON表达式,CRON表达式可以自己填写,也可以点击后面的编辑按钮自动生成。选择BEAN作为运行方式,JobHandler的值为之前@XxlJob注解填写的值,task参数为定时任务的方法参数。配置完成后,回到执行器管理,点击查看,可以查看新注册的节点信息:再次回到任务管理,选择开始,就可以开始执行定时任务了:打开后,点击调度日志,可以看到我们系统任务执行的详细信息:可以看到,是每5秒执行一次。点击调度笔记可以查看一些调度详情:在右侧的操作按钮中选择执行日志:可以查看执行详情:红框内就是我们刚才打印出来的。当然,这里还有一些其他的玩法。大家可以点击按钮自行尝试,我就不赘述了。3.2.3GLUE模式(Java)任务以源码形式维护在调度中心,支持通过WebIDE在线更新,实时编译验证,无需指定JobHandler。也就是把定时任务的代码写在网页上,然后执行。个人感觉这种方法用的比较少,小伙伴们可以借鉴一下。开发流程如下:调度中心->任务管理,新建一个调度任务,新建时选择“GLUE模式(Java)”:开发任务代码:选择指定任务,点击右侧的GLUE按钮任务端,会进入GLUE任务界面的WebIDE,支持任务代码的开发(也可以在IDE中开发完成后复制粘贴到编辑器中)。编辑好后,保存。接下来和之前一样,启动任务,然后查看调度日志。这里支持30个版本的版本回溯。在GLUE任务的WebIDE界面,选择右上角的“VersionBacktracking”下拉框,会列出GLUE的更新历史。选择对应的版本显示版本码,保存GLUE码即回滚到对应的历史版本。4.总结,这就是我给大家介绍的xxl-job。有兴趣的小伙伴可以试试哦~公众号后台回复xxl-job-demo可以下载本文的案例。