xxl-job对比ElasticJob使用示例详解

目录
  • 1. xxl-job
  • 2. 运行 xxl-job
  • 3. 开发定时任务
    • 3.1 项目创建及配置
    • 3.2 定时任务开发方式
      • 3.2.1 BEAN 模式(类形式)
      • 3.2.2 BEAN模式(方法形式)
      • 3.2.3 GLUE 模式(Java)
  • 4. 小结

1. xxl-job

松哥也在微信群里和小伙伴们讨论过各自到底用的是 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 具有良好的扩展性和可用性。

所以,你打算用哪个?

2. 运行 xxl-job

我们先把 xxl-job 跑起来,再写我们自己的代码。

首先我们先把 xxl-job 的代码搞下来,地址:

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

然后用 IDEA 打开项目,打开之后,有四个主要的文件夹:

doc:项目文档xxl-job-admin:任务调度平台xxl-job-core:核心代码xxl-job-executor-samples:案例

由于 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 文件中,有如下一行:

<property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>

如果你是 Windows 操作系统,这里肯定要改,如果你是 Mac 的话,也有可能没有这个目录的权限,因此我建议大家改一下这里的配置,改为如下这样:

<property name="log.path" value="./applogs/xxl-job/xxl-job-admin.log"/>

改为在项目运行目录下生成这个日志文件。

修改完成后,接下来我们就可以启动 xxl-job-admin 项目了,这是一个 SpringBoot 项目,找到启动类,直接运行其 main 方法即可。

项目启动成功后,浏览器输入如下地址 http://localhost:8080/xxl-job-admin/toLogin,就可以看到登录页面了:

默认的登录账号是 admin/123456。

看到如下页面,就是登录成功了。

3. 开发定时任务

3.1 项目创建及配置

接下来我们来创建一个项目,跑一个定时任务看看。

首先创建一个 SpringBoot 项目,引入 Web 依赖,如下:

项目创建成功后,引入 xxl-job 的依赖:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.0</version>
</dependency>

然后在 resources 目录下加入 logback.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>
    <property name="log.path" value="./applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>

</configuration>

修改 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。

接下来我们就可以创建一个具体的定时任务了。

3.2 定时任务开发方式

对于我们 Java 工程师而言,有三种开发定时任务的方式。

3.2.1 BEAN 模式(类形式)

Bean 模式任务,支持基于类的开发方式,每个任务对应一个 Java 类。

优点:不限制项目环境,兼容性好。即使是无框架项目,如 main 方法直接启动的项目也可以提供支持。

缺点:

  • 每个任务需要占用一个Java类,造成类的浪费;
  • 不支持自动扫描任务并注入到执行器容器,需要手动注入。

开发方式:

1.开发一个继承自 com.xxl.job.core.handler.IJobHandler 的 JobHandler 类,实现其中任务方法。

2.手动通过如下方式注入到执行器容器:

XxlJobExecutor.registJobHandler("demoJobHandler", new DemoJobHandler());

3.在调度中心新建调度任务(后续步骤和 3.2.1 BEAN 模式(方法形式) 一致)。

这种方式用的不多,我就不给大家演示了,小伙伴们可以自行尝试。

3.2.2 BEAN模式(方法形式)

Bean 模式任务,支持基于方法的开发方式,每个任务对应一个方法,一般推荐这种方式。

优点:

  • 每个任务只需要开发一个方法,并添加 ”@XxlJob” 注解即可,更加方便、快速。
  • 支持自动扫描任务并注入到执行器容器。

缺点:

要求 Spring 容器环境。

基于方法开发的任务,底层会生成 JobHandler 代理,和基于类的方式一样,任务也会以 JobHandler 的形式存在于执行器任务容器中。

开发步骤:

1.开发 Job 方法:

@Component
public class MyJob {
    @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler() 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 项目。

2.配置调度中心,新建调度任务

接下来打开配置调度中心,找到执行器管理,点击新增,如下:

如果是自动注册的话,可以不用填机器地址。

接下来找到任务管理,并点击新增:

基础配置都没啥好说的。

调度类型选择 CRON 表达式,CRON 表达式可以自己填,也可以点击后面的编辑按钮自动生成。

运行模式就选择 BEAN,JobHandler 的值就是我们前面 @XxlJob 注解中填的值,任务参数就是定时任务的方法参数。

配置完成后,回到执行器管理,点击查看,可以查看刚刚注册的节点信息:

再次回到任务管理,选择启动,就可以开始定时任务的执行了:

开启之后,点击调度日志,就可以看到我们系统任务执行的详细信息了:

可以看到,每隔 5 秒执行一次。

点击调度备注,可以查看一些调度细节:

在右边操作按钮中选择执行日志:

可以查看执行细节:

红色框出来的,就是我们刚刚自己打印的。

当然这里还有一些其他玩法,小伙伴们可以自行点击按钮尝试,我就不赘述了。

3.2.3 GLUE 模式(Java)

任务以源码方式维护在调度中心,支持通过 Web IDE 在线更新,实时编译和生效,因此不需要指定 JobHandler。即在网页上写定时任务的代码,然后去执行。

这种方式个人感觉使用较少,小伙伴们了解一下即可。

开发流程如下:

调度中心->任务管理,新建调度任务,新建时选择 “GLUE模式(Java)”:

2.开发任务代码:选中指定任务,点击该任务右侧 GLUE 按钮,将会前往 GLUE 任务的 Web IDE 界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑中)。

编辑完成后,保存即可。接下来又和前面一样了,启动任务,后查看调度日志。

这里支持 30 个版本的版本回溯,在 GLUE 任务的 Web IDE 界面,选择右上角下拉框“版本回溯”,会列出该 GLUE 的更新历史,选择相应版本即可显示该版本代码,保存后 GLUE 代码即回退到对应的历史版本。

4. 小结

好啦,这就是我跟大家介绍的 xxl-job,感兴趣的小伙伴可以试试哦~

本文案例 https://github.com/lenve/javaboy-code-samples/tree/master/xxl-job-demo

以上就是xxl-job对比ElasticJob使用示例详解的详细内容,更多关于xxl-job对比ElasticJob的资料请关注我们其它相关文章!

(0)

相关推荐

  • 分布式任务调度xxl-job问题解决

    目录 前言 xxl-job简介 功能如下 快速入门 2.1初始化“调度数据库” 2.2编译源码 2.3配置部署“调度中心” 2.4配置部署“执行器项目” 2.5开发第一个任务“HelloWorld” 前言 在单机应用时期,任务调度一般都是基于spring schedule和集成quartz来实现的,当系统发展成分布式服务,应用多实例的时候,任务就会出现多次调用的问题,很多时候我们任务并不需要跑多次.解决方案有很多,最最简单粗暴的就是可以设置应用开关.其次就是集中式话任务管理调度.当然,quart

  • SpringBoot2整合ElasticJob框架过程详解

    一.ElasticJob 简介 1.定时任务 在前面的文章中,说过QuartJob这个定时任务,被广泛应用的定时任务标准.但Quartz核心点在于执行定时任务并不是在于关注的业务模式和场景,缺少高度自定义的功能.Quartz能够基于数据库实现任务的高可用,但是不具备分布式并行调度的功能. -> QuartJob定时任务 2.ElasticJob说明基础简介 Elastic-Job 是一个开源的分布式调度中间件,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-

  • SpringBoot整合Xxl-job实现定时任务的全过程

    目录 前言 一.部署调度中心 1.项目下载 2.初始化数据 3.修改properties配置文件 二.部署SpringBoot项目 1.引入依赖 2.创建配置类 3.修改配置文件 4.创建执行器 5.启动SpringBoot项目 三.通过调度中心进行任务调度 1.添加执行器 2.添加任务 3.任务调度中心发起任务调度 四.小结 总结 前言 ​ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 如果是单机

  • java定时任务框架elasticjob详解

    前言 Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范部分.该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发. ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX. 项目开源地址:https://github.com/dangdangdotcom/elastic-job Elastic-Job是ddframe中d

  • 分布式调度XXL-Job整合Springboot2.X实战操作

    一.定时任务的使用场景和常见的定时任务 二.如何选择哪一个分布式任务调度平台 三.xxl-job的设计思想 ​ 四.XXL-Job具有哪些特性 五.XXL-Job实战操作 一.定时任务的使用场景和常见的定时任务 某个时间定时处理某个任务.发邮件.短信.消息提醒.订单通知.统计报表等 定时任务划分  单机定时任务:    单机的容易实现,但应用于集群环境做分布式部署,就会带来重复执行    解决方案有很多比如加锁.数据库等,但是增加了很多非业务逻辑 分布式调度:      把需要处理的计划任务放入

  • xxl-job对比ElasticJob使用示例详解

    目录 1. xxl-job 2. 运行 xxl-job 3. 开发定时任务 3.1 项目创建及配置 3.2 定时任务开发方式 3.2.1 BEAN 模式(类形式) 3.2.2 BEAN模式(方法形式) 3.2.3 GLUE 模式(Java) 4. 小结 1. xxl-job 松哥也在微信群里和小伙伴们讨论过各自到底用的是 xxl-job 还是 ElasticJob,讨论的结果就是,xxl-job 使用的人更多一些. 不说功能的优劣,我们单纯从数据上其实就能看出一些端倪: 这是 xxl-job 的

  • 创建图片对比slider滑块示例详解

    目录 引言 CSS JavaScript 定义 HTML 结构 定义 CSS 样式 实际代码 引言 在这篇文章, 我们会创建一个 slider 滑块来对比两张图片. 老样子,话不多说,先看效果. CSS .container { position: relative; } .resizer { background-color: #cbd5e0; cursor: ew-resize; height: 100%; left: 50%; position: absolute; top: 0; wid

  • .NetCore实现上传多文件的示例详解

    本章和大家分享的是.NetCore的MVC框架上传文件的示例,主要讲的内容有:form方式提交上传,ajax上传,ajax提交+上传进度效果,Task并行处理+ajax提交+上传进度,相信当你读完文章内容后能后好的收获,如果可以不妨点个赞:由于昨天电脑没电了,快要写完的内容没有保存,今天早上提前来公司从头开始重新,断电这情况的确让人很头痛啊,不过为了社区的分享环境,这也是值得的,不多说了来进入今天的正篇环节吧: form方式上传一组图片 先来看看咋们html的代码,这里先简单说下要上传文件必须要

  • 为什么不推荐使用BeanUtils属性转换工具示例详解

    什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品. BeanUtils工具一般可以方便javaBean的哪些操作? 1)beanUtils 可以便于对javaBean的属性进行赋值. 2)beanUtils 可以便于对javaBean的对象进行赋值. 3)beanUtils可以将一个MAP集合的数据拷贝到一个javabean对象中. 1 背景 之前在专栏中讲过"不推荐使用属性拷贝工具",推荐直接定义转换类和方

  • C#中的委托delegate用法的示例详解

    C#中的委托 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在.本章中,我将由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..NET Framework 中的委托和事件.委托中方法异常和超时的处理.委托与异步编程.委托和事件对Observer 设计模式的意义,对它们的编译代码也做了讨论. 1.

  • SpringBoot2 整合FreeMarker实现页面静态化示例详解

    一.页面静态化 1.动静态页面 静态页面 即静态网页,指已经装载好内容HTML页面,无需经过请求服务器数据和编译过程,直接加载到客户浏览器上显示出来.通俗的说就是生成独立的HTML页面,且不与服务器进行数据交互. 优缺点描述: 静态网页的内容稳定,页面加载速度极快: 不与服务器交互,提升安全性: 静态网页的交互性差,数据实时性很低: 维度成本高,生成很多HTML页面: 动态页面 指跟静态网页相对的一种网页编程技术,页面的内容需要请求服务器获取,在不考虑缓存的情况下,服务接口的数据变化,页面加载的

  • java中常见的6种线程池示例详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如下 线程池名称 描述 FixedThreadPool 核心线程数与最大线程数相同 SingleThreadExecutor 一个线程的线程池 CachedThreadPool 核心线程为0,最大线程数为Integer. MAX_VALUE ScheduledThreadPool 指定核心线程数的定时

  • Python模块glob函数示例详解教程

    目录 本文大纲 支持4个常用的通配符 1)glob()函数 2)iglob()函数 3)escape()函数 总结 本文大纲 glob模块也是Python标准库中一个重要的模块,主要用来查找符合特定规则的目录和文件,并将搜索的到的结果返回到一个列表中.使用这个模块最主要的原因就是,该模块支持几个特殊的正则通配符,用起来贼方便,这个将会在下方为大家进行详细讲解. 支持4个常用的通配符 使用glob模块能够快速查找我们想要的目录和文件,就是由于它支持*.**.? .[ ]这三个通配符,那么它们到底是

  • python机器学习创建基于规则聊天机器人过程示例详解

    目录 聊天机器人 基于规则的聊天机器人 创建语料库 创建一个聊天机器人 总结 还记得这个价值一个亿的AI核心代码? while True: AI = input('我:') print(AI.replace("吗", " ").replace('?','!').replace('?','!')) 以上这段代码就是我们今天的主题,基于规则的聊天机器人 聊天机器人 聊天机器人本身是一种机器或软件,它通过文本或句子模仿人类交互. 简而言之,可以使用类似于与人类对话的软件进

  • TensorFlow卷积神经网络AlexNet实现示例详解

    2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它可以算是LeNet的一种更深更宽的版本.AlexNet以显著的优势赢得了竞争激烈的ILSVRC 2012比赛,top-5的错误率降低至了16.4%,远远领先第二名的26.2%的成绩.AlexNet的出现意义非常重大,它证明了CNN在复杂模型下的有效性,而且使用GPU使得训练在可接受的时间范围内得到结果,让CNN和GPU都大火了一把.AlexNet可以说是神经网络在低谷期后的第一次发声,确立了深

随机推荐