【分布式任务调度】XXL-JOB快速搭建从入门到精通

2,017 阅读4分钟

上一篇文章,我们使用Java代码实现了一个简单的定时任务管理,这一篇我们使用xxljob实现定时任务管理。 xxljob的基本使用:

源码地址

要使用xxljob请去下载这的源码,目前最新版本为:2.4.0
GitHub地址: github.com/xuxueli/xxl…
git地址: github.com/xuxueli/xxl…

下载后你会得到这样一个目录:

image.png

其中我们主要使用的是xxl-job-admin这个工程。要做生产级别的使用,我们必须使用数据库做载体。

准备数据库

我们打开“xxl-job-master->doc->db->tables_xxl_job.sql”这个文件,把它放到我们的mysql中运行它。

image.png

就不给大家放sql语句了 直接去项目中找就可以了 运行后我们会得到八张表如图:

image.png

到这我们前置工作已经完成,开始正式开始动代码

我们需要修改xxl-job-admin工程下的 application.properties 这里需要修改两个部分一个是数据库(改成自己的数据库地址,账户名,密码),一个是邮件(因为我没有证书等,所以没有动,直接弃用此功能)如图:

image.png xxljob项目修改的很少,只需要修改配置就已完成,直接启动xxl-job-admin下的XxlJobAdminApplication项目即可 注意端口号默认8080 不要跟其他项目端口冲突,可根据项目情况修改不同端口

image.png 代表启动成功

下面开始修改自己项目

1.增加pom依赖
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.4.0</version>
</dependency>
2.修改配置文件

在xxljob工程xxl-job-executor-sample-springboot此模块下的application.properties 配置信息,复制到自己项目的配置中 为方便大家 可直接复制使用

### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### xxl-job, access token
xxl.job.accessToken=default_token

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

因为我项目是配置文件是yml,所以是这样的

# xxl-job admin address list
xxl:
  job:
    admin:
      addresses: http://localhost:8080/xxl-job-admin
# xxl-job executor app config
    executor:
      appname: xxl-job-executor-sample
      address:
      ip:
      port: 9999
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
    accessToken: default_token
3.增加XxlJobConfig.java

在xxljob下有此代码直接复制到自己项目 位置在:

image.png

也给大家直接上代码,复制过去即可

package com.jz.app.server.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@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;
    }

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}
4.增加测试方法(自己的定时任务方法,注解内容很重要)
package com.jz.app.server.quartzTask;

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

@Component
public class MyJobHandler{


    @XxlJob("MyJobHandler")
    public void execute() throws Exception {
        System.out.println("hello xxljob");
    }
}
5.代码改动完成启动项目

image.png

启动后看到这个,代表xxljob可以使用

现在进入到页面配置定时任务 http://localhost:8080/xxl-job-admin/ 账号密码默认:admin/123456 如需修改或新增可改xxl_job_user此表,请注意数据库中密码是MD5加密(www.sojson.com/encrypt_md5…

登录成功后进入此页面

image.png

两个重要模块箭头标记位置
1.首先进入 执行器管理 进行配置

image.png

AppName: 需要与项目配置文件中appName名称一致 名称:随意 注册方式:自行注册 之后保存

image.png

OnLine 机器地址 如果显示无,注册方式可选手动注册

2.进入 任务管理 进行配置

image.png

红色框框中 cron表达式要写正确,代码此方法需要什么时候执行 运行模式默认第一个 jobHandler:代表你要执行的xxljob,不可以重复(类似身份证)

image.png

跟这里保持一致 保存后像这样展示

image.png

点击操作旁的三角号

image.png

需要立刻执行,点击执行一次

image.png

代表运行成功 需要定时任务启动执行:点击启动,不执行:点击停止 启动后如图:

image.png 到此就完成了使用xxljob对定时任务的管理

注:将我自己遇到的问题说下,可能你也会碰到

1.报错信息:xxl-job remoting error(Unexpected end of file from server), for url : 此问题是由于netty版本问题,使用此版本即可

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.48.Final</version>
</dependency>

2.还有些问题 是由于配置不匹配造成,大家跟着我这个,应该不会出现

如有其他问题,可留言或私信我,我们大家一起解决,希望此篇文章对您有用,感谢您的阅读,祝您早日实现金钱自由