前言

  大家好,我是福隆苑居士,今天给大家聊聊XXL-JOB的使用。

  XXL-JOB是本人呆过的三家公司都使用到的分布式任务调度平台,前两家都是服务于传统行业(某大型移动基地和某大型电网),现在这家是服务于互联网行业(和腾讯阿里都有战略合作),从1.9.x版本使用到现在的2.3.0版本,我认为XXL-JOB的使用方式越来越简单且高效,刚发版时的BUG也修复了很多,并且跟上了这些年技术发展的节奏,可以预见会继续被更多中小企业所亲睐。

推荐原因

1)、经过几年的发展,受众多,中小企业尤其喜欢;

2)、持续更新迭代,修复了很多BUG,2.0版本开始引入了新的特性,耦合性降低;

3)、搭建相当简单,几乎是傻瓜式,开箱即用,这也是我最喜欢的原因;

4)、源码有很多学习的地方,虽然刚开始有被一些资深程序员诟病,但经过大量线上环境洗礼,已经非常稳定,个人以前有读过源码,几乎都是java最基础的开发方式,朴实无华到你以为自己穿越到十年前,但换成自己又写不出来,就是这种奇妙的感觉。

安装方法

这里我以xxl-job最新版2.3.0为例讲解

官方文档:https://www.xuxueli.com/xxl-job/

1、下载

源码仓库地址

源码仓库地址 Release Download
https://github.com/xuxueli/xxl-job Download
http://gitee.com/xuxueli0323/xxl-job Download

中央仓库地址

 <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>

友情提示:个人推荐使用源码安装方式,然后打jar包部署,因为xxljob本身使用了springboot框架,可以和其他项目一起发布到k8s,且后期更便于维护。

2、安装

xxljob主要分为调度中心和执行器,简单来讲,调度中心就是后台管理,执行器就是执行定时任务的,就这么理解就行,没那么高大上。

1)、执行sql

在db目录下,放到MySQL中直接执行即可。



2)、调度中心

调度中心就是xxl-job-admin,打开application.properties,修改数据源中的地址和账号密码即可。

然后直接启动项目就行,真实环境中就是打jar包发布执行。

启动后,访问:http://localhost:8080/xxl-job-admin 

(该地址后面要装的执行器将会使用到,作为回调地址。)

3)、执行器

  执行器就是xxl-job-executor-samples工程里面的项目,我们选择第二个springboot项目即可,当然,你也可以单独把这个项目摘取出来,我反正每次不去管它,没啥影响。

  打开application.properties,需要修改的也就是调度中心的地址,因为执行器要注册到调度中心才能执行任务,其他的都是执行器的选填项,一般没必要不改就行。

同样的,检查完配置后启动这个springboot项目即可,也可以打成jar包发布。

启动后,一般过一会儿就会注册到调度中心,打开调度中心后台的执行器管理就能发现已经连上了。

至此,xxl-job实际上就搭建完成了,可以发现,作者从一开始就是想着开箱即用,所以非常简单。

最佳使用方法

  这里我专门说下,我从在广州工作经历的两家公司到现在的互联网公司,都用了xxl-job,前面的公司分别用到了两种调度方式,直到目前的公司,使用了新版开始才用到了第三种方式,也是我认为对程序员最友好的方式。

  这种方式叫做原生内置Bean模式任务,在官网有一个小小的位置讲到了,后面会贴给大家看。

1)、编写测试方法

这里我们编写两个简单的获取用户信息接口(GET方式)和新增订单接口(POST方式)

package com.example.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import java.util.Map; /**
* <p>
* 测试控制器
* </p>
*
* @author 福隆苑居士,公众号:【Java分享客栈】
* @since 2022-02-23 15:46
*/
@RestController
@RequestMapping("/api")
public class TestController { private static final Logger log = LoggerFactory.getLogger(TestController.class); /**
* 获取用户信息
*/
@GetMapping("/getUser")
public String getUser(@RequestParam(value = "userId") String userId,
@RequestParam(value = "param") String param) { log.debug("[XXLJOB]>>>> 获取用户信息....userId={}, param={}", userId, param); return "成功";
} /**
* 新增订单信息
*/
@PostMapping(value = "/saveOrder", produces = MediaType.APPLICATION_JSON_VALUE)
public String saveOrder(@RequestBody(required = false) Map<String, String> reqMap) { log.debug("[XXLJOB]>>>> 新增订单信息....reqMap={}", reqMap); return "成功";
}
}
2)、GET方式

  打开任务管理,点击新增,然后按照图示配置即可,这里特别说明,JobHandler一栏必须填写httpJobHandler,这是xxl-job内置的handler,不能写错名称。

  传参就在url后面写即可

3)、POST方式

和上面一样写法,唯一不同就是传参这里,post方式的data中参数对象传json格式,不能换行,要连着写,否则会报错。

4)、效果

启动测试项目两个接口,然后将调度中心我们新建的两个定时任务打开,看10秒和15秒后是不是分别开始执行两个测试接口。

可以看到,两个接口都会根据cron表达式配置的时间开始执行调度任务,说明我们整个调度平台搭建是成功的。

说明

  官网文档其实写的很清晰,我这里贴出几种调度方式给大家看,里面最常用的其实是BEAN模式类形式,这种需要人工开发Job类,然后调度中心新建任务指向这个JobHandler,本人前两个公司都是这么用的,当时就总觉得不太习惯。



  红框中的就是本文讲到的BEAN方法形式中的内置模式,也就是直接调http接口就行,不需要额外编写Job类,这种其实最符合高内聚低耦合的原则,项目中调度任务越多越能发现这种方式维护起来有多清爽。

这里贴出来数据库表中的内容,可以发现xxl_job_info表存的就是我们新建的定时任务信息。

然后xxl_job_log表存的就是我们执行调度任务产生的日志,可以发现一会儿就几十条了,那么会不会在线上环境把日志表撑爆呢,看下面一张图。

前面讲过的调度中心和执行器的application.properties文件中,最后有一行都有配置日志保存天数的,默认是30天,可以根据项目规模进行修改。

实际上,用了好几年,我认为这个日志作用不大,不需要保留太久,项目规模不大的话就默认也行。

总结

  xxl-job的使用非常简单,中小厂甚至不需要集群都是够用的,这个调度平台哪怕挂掉了,重启后依然能继续执行,基本不影响原有业务逻辑,我呆过的这三个公司都是单机部署,线上也没出现过任何问题,这也是我极力推荐给大家的原因,好学好用,不就是懒人必备么。


如果大家觉得有一滴滴帮助的话,就请一键……伸出芊芊玉手点个推荐推荐推荐吧~~

【Java分享客栈】我为什么极力推荐XXL-JOB作为中小厂的分布式任务调度平台的更多相关文章

  1. 【Java分享客栈】SpringBoot整合WebSocket+Stomp搭建群聊项目

    前言 前两周经常有大学生小伙伴私信给我,问我可否有偿提供毕设帮助,我说暂时没有这个打算,因为工作实在太忙,现阶段无法投入到这样的领域内,其中有两个小伙伴又问到我websocket该怎么使用,想给自己的 ...

  2. 【Java分享客栈】一文搞定CompletableFuture并行处理,成倍缩短查询时间。

    前言   工作中你可能会遇到很多这样的场景,一个接口,要从其他几个service调用查询方法,分别获取到需要的值之后再封装数据返回.   还可能在微服务中遇到类似的情况,某个服务的接口,要使用好几次f ...

  3. 【Java分享客栈】一文搞定京东零售开源的AsyncTool,彻底解决异步编排问题。

    一.前言 本章主要是承接上一篇讲CompletableFuture的文章,想了解的可以先去看看案例: https://juejin.cn/post/7091132240574283813 Comple ...

  4. 【Java分享客栈】SpringBoot线程池参数搜一堆资料还是不会配,我花一天测试换你此生明白。

    一.前言   首先说一句,如果比较忙顺路点进来的,可以先收藏,有时间或用到了再看也行:   我相信很多人会有一个困惑,这个困惑和我之前一样,就是线程池这个玩意儿,感觉很高大上,用起来很fashion, ...

  5. 【Java分享客栈】超简洁SpringBoot使用AOP统一日志管理-纯干货干到便秘

    前言 请问今天您便秘了吗?程序员坐久了真的会便秘哦,如果偶然点进了这篇小干货,就麻烦您喝杯水然后去趟厕所一边用左手托起对准嘘嘘,一边用右手滑动手机看完本篇吧. 实现 本篇AOP统一日志管理写法来源于国 ...

  6. Java 分布式任务调度平台:PowerJob 快速开始+配置详解

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>系列. 项目地址: https://github.c ...

  7. 【Java分享客栈】一个包装过简历的新同事写完微信支付引起事故后果断离职了

    前言 挺长时间没发文了,因为公司有一个紧急项目要赶进度,加班如吃饭喝水,久违的进入到码农的状态. 之所以抽空来发个文,是这个项目才刚上线,时间不长却因为一位新同事的代码引起了生产环境的事故,造成了一批 ...

  8. 【Java分享客栈】我有一个朋友,和前端工程师联调接口被狠狠鄙视了一番。

    前言 我有一个朋友,昨天和前端工程师联调一个接口,然后被狠狠鄙视了一番. 大家知道,自从前后端分离以后,像我一样一直以Java工程师为傲而自居的码圣们就砍掉了一半脊梁,从此被贴上了"Java ...

  9. 【Java分享客栈】Java程序员为争一口气熬夜硬刚CSS实现掘金首页

    前言 如果我做不了最厉害的Java工程师,那我就做Java工程师中最厉害的前端工程师. 前段时间,我默默给自己又喂了这碗心灵鸡汤-- 我不是很厉害的Java工程师,哪怕我已经工作八年,我依然觉得自己和 ...

随机推荐

  1. Python网络编程之网络基础

    Python网络编程之网络基础 目录 Python网络编程之网络基础 1. 计算机网络发展 1.1. OSI七层模型 1.2. 七层模型传输数据过程 2. TCP/IP协议栈 2.1 TCP/IP和O ...

  2. RocketMQ架构原理解析(四):消息生产端(Producer)

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  3. .NET下如何拦截鼠标、键盘消息?Win32NET来帮你

    Win32NET是一个Win32API的.NET下封装的类库,包含: 1: 常用win32的API的net封装 2:鼠标.键盘.热键hook钩子模块, 3:模拟键盘输入文字(支持各种字符文字.不同语言 ...

  4. 今日学习——蓝桥杯 2019年 C语言 B组

    1.手淦(亲身体验,,,没啥大用,最终还是代码) 2.代码(下面是我看其他博主代码答案能看的懂的....具体的可以直接去下面的网址看) https://blog.csdn.net/qq_4452491 ...

  5. 【记录一个问题】opencl enqueueWriteBuffer()中,cl_bool blocking参数设置无效

    err = queue.enqueueWriteBuffer(in_buf, true, 0, bmp_size, bmp_data, NULL, &event); 以上代码中,第二个参数设置 ...

  6. Zotero群组新建后无法显示

    我们新建Zotero的群组后无法显示. 此时需要点击文献库,就刷新了. 修改Zotero的群组后无法显示修改后的名称 点击同步即可同步内容.

  7. 使用 fail2ban 保护 frp 服务

    背景 我们一般会使用 fail2ban 来保护暴露到公网的提供密码登录的 ssh 连接等. 但使用 frp 穿透后所有的从外网访问都会变成 127.0.0.1 进入的,原本能用 fail2ban 保护 ...

  8. Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境

    一,引言 之前我讲过的所有的案例中,都是将整个Azure Resource 部署到同一个订阅下,没有做到灵活的在 Azure Pipeline 在运行前选择需要部署的环境.在实际的项目开发中,我们也会 ...

  9. golang中的接口值

    package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参 ...

  10. golang中内存地址计算-根据内存地址获取下一个内存地址对应的值

    package main import ( "fmt" "unsafe" ) func main() { // 根据内存地址获取下一个字节内存地址对应的值 da ...