为什么更多公司会选择xxl-job?

思维导图

文章已收录精选,欢迎Star:

一、概述

在平常的业务场景中,常常有一些场景须要使用定时任务,例如:

所以定时任务在平常开发中并不稀少,但是对于现今快速消费的时代,每天都须要发送各类推送,消息都须要依赖定时任务去完成,应用极其广泛。

二、为什么须要任务调度平台

在Java中,传统的定时任务实现方案,例如Timer,等都或多或少存在一些问题:

并且在现今分布式的构架中,有一些场景须要分布式任务调度:

其实传统的定时任务早已不满足现今的分布式构架,所以须要一个分布式任务调度平台,目前比较主流的是和xxl-job。

由当当网开源,目前有6.5k的Star任务平台,使用的公司在官网登记有76家。

跟xxl-job不同的是,是采用实现分布式协调,实现任务高可用以及分片。

三、为什么选择XXL-JOB

实际上更多公司选择xxl-job,目前xxl-job的上有15.7k个star,登记公司有348个。毫无疑惑和xxl-job都是十分优秀的技术框架,接出来我们进一步对比讨论,探求一下为何更多公司会选择xxl-job。

首先先介绍一下xxl-job,这是出自大众点评许雪里(xxl就是作者名子的拼音首字母)的开源项目,官网上介绍这是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩充。跟不同,xxl-job环境依赖于mysql,不用,这也是最大的不同。

的本意是为了面对高并发复杂的业务,虽然是在业务量大,服务器多的时侯也能做好任务调度,尽可能的借助服务器的资源。使用使其具有高可用、一致性的,并且还具有良好的扩充性。官网上写是无中心化的,通过的补选机制改选出主服务器,假如主服务器挂了,会重新补选新的主服务器。因而具有良好的扩充性和可用性,并且使用和运维有一定的复杂。

xxl-job则相反,是通过一个中心式的调度平台,调度多个执行器执行任务,调度中心通过DB锁保证集群分布式调度的一致性,这样扩充执行器会减小DB的压力,而且假如实际上这儿数据库只是负责任务的调度执行。而且假如没有大量的执行器的话和任务的情况,是不会导致数据库压力的。实际上大部份公司任务数,执行器并不多(尽管笔试常常会问一些高并发的问题)。

相对来说,xxl-job中心式的调度平台轻量级,开箱即用,操作简易,上手快,与有特别好的集成,并且监控界面就集成在调度中心,界面又简约,对于企业维护上去成本不高,还有失败的电邮告警等等。这就使好多企业选择xxl-job做调度平台。

四、安装4.1拉取源码

搭建xxl-job很简单,有拉取镜像布署和源码编译两种形式,布署的方法比较简单,我就讲源码编译的形式。首先到拉取xxl-job源码到本地。

4.2导出IDEA

拉取源码出来后,可以看见项目结构,如下:

导出到IDEA,配置一下Maven,下载相关的jar包,稍等一下后,就可以见到这样的项目:

4.3初始化数据库

上面讲过xxl-job须要依赖mysql,所以须要初始化数据库,在xxl-job\doc\db路径下找到.sql文件。在mysql上运行sql文件。

4.4配置文件

接着就改一下配置文件,在admin项目下找到.文件。

### 调度中心JDBC链接
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=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=10

4.5编译运行

简单一点直接跑admin项目的main方式启动也行。

假如布署在服务器呢,那我们须要打包成jar包,在IDEA借助Maven插件打包。

之后在xxl-job\xxl-job-admin\路径下,找到jar包。

之后就得到jar包了,使用java-jar命令就可以启动了。

到这儿就早已完成了!打开浏览器,输入:8080/xxl-job-admin步入管理页面。默认帐号/密码:admin/。

五、永远的

布署了调度中心以后任务平台,须要往调度中心注册执行器,添加调度任务。接出来就参考xxl-job写一个简单的反例。

首先创建一个项目,名子叫"-demo",添加依赖。


    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.boot
        spring-boot-starter
    
    
        com.xuxueli
        xxl-job-core
        2.2.0
    

接着更改.。

# web port
server.port=8081
# log config
logging.config=classpath:logback.xml
spring.application.name=xxljob-demo
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-demo
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=10

接着写一个配置类。

@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;
    }
}

接着编撰一个任务类,使用Bean模式。

@Component
public class XxlJobDemoHandler {
    /**
     * Bean模式,一个方法为一个任务
     * 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT execute(String param)"
     * 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
     * 3、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
     */
    @XxlJob("demoJobHandler")
    public ReturnT demoJobHandler(String param) throws Exception {
        XxlJobLogger.log("java, Hello World~~~");
        XxlJobLogger.log("param:" + param);
        return ReturnT.SUCCESS;
    }
}

在目录下,添加.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
            
        
    
    
        
        
    

写完以后启动服务,之后可以打开管理界面,找到执行器管理,添加执行器。

接着到任务管理,添加任务。

最后我们可以到任务管理去测试一下,运行。

点击保存后,会立刻执行。点击查看日志,可以看见任务执行的历史日志记录。

打开刚才执行的执行日志,我们可以看见,运行成功。

这就是简单的Demo演示,十分简单,上手也快。

六、谈谈构架设计

下边简单地说一下xxl-job的构架,我们先看官网提供的一张构架图来剖析。

从构架图可以看出,分别有调度中心和执行器两大组成部份

接出来我们看一下xxl-job的工作原理。

唠叨

看完以上的内容,基本算入门了。实际上,xxl-job还有好多功能,要深入学习,还须要到官网去研究探求。最好就是自己在本地搭建一个xxl-job来玩儿,动手实践是学得最快的学习方法。

里面所有反例的代码都上传了:

认为有用就点个赞吧,你的点赞是我创作的最大动力~

拒绝做一条咸鱼,我是一个努力让你们记住的程序员。我们上期再会!!!

能力有限,假如有哪些错误或则不当之处,请你们批评见谅,一起学习交流!

标签: 调度 定时 源码 实际 架构

  • 评论列表 (0)

留言评论