上一篇讲述了如何在docker中部署xxl-job调度中心,

这一篇就是讲述springboot如何集成xxl-job作为执行器

1.导入pom

(此处一定一定要注意和调度中心的版本要保持一致)

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

2.appliaction.yml中加上如下配置

server:
  port: 8081
xxl:
  job:
    accessToken:
      default_token
    admin:
      addresses: http://127.0.0.1:9051/xxl-job-admin
    executor:
      address:
      appname: xxl-job-invoice-api
      ip:
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
      port: 9990

addresses:调度中心地址,如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调",为空则关闭自动注册。(此处127.0.0.1可以替换为自己的服务器地址,9051是服务器docker中部署xxl-job的端口号)

appname:执行器 ,执行器心跳注册分组依据,为空则关闭自动注册
ip:默认为空表示自动获取,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用,地址信息用于 “执行器注册” 和 “调度中心请求并触发任务”
port:执行器端口号,小于等于0则自动获取,默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口
logpath:执行器运行日志文件存储磁盘路径  ,需要对该路径拥有读写权限,为空则使用默认路径
logretentiondays:执行器日志保存天数 [选填] ,值大于3时生效,启用执行器Log文件定期清理功能,否则不生效

accessToken:执行器通讯,(要与调度中心的代码配置一致,目前源码的默认token为(default_token)。配置出错会出现以下token不一致的情况:

>>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='xxl-job-invoice-api', registryValue='http://xxxxxx:9990/'}, registryResult:ReturnT [code=500, msg=The access token is wrong., content=null]

3.执行器配置

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;

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

4.编写定时任务

import cn.hutool.core.date.DateUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


/**
 * XxlJob开发示例(Bean模式)
 *
 * 开发步骤:
 *      1、任务开发:在Spring Bean实例中,开发Job方法;
 *      2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
 *      3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
 *      4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
 *
 * @author xuxueli 2019-12-11 21:52:51
 */

@Slf4j
@Component
public class JobSample {
    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob(value = "duZhuoJob1")
    public ReturnT<String> startJob2(String param) {
        log.info(">>>>>>>>>>>>>>>>>" + DateUtil.now() + " param: " + param + ">>>>>>>>>>>>执行");
        System.out.println("duZhuoJob1 is success");
        return ReturnT.SUCCESS;
    }
}

此处为BEAN模式(方法形式),具体说明可参考官方学习文档分布式任务调度平台XXL-JOB

问题:在后面调度中心查询日志时,发现没有打印对应的日志

 解决方法:

这是因为日志的输出方式不对,需要通过 "XxlJobHelper.log" 打印执行日志,以下是修正后的:

@Component
public class JobSample {
    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob(value = "duZhuoJob1")
    public ReturnT<String> startJob2(String param) {
        XxlJobHelper.log(">>>>>>>>>>>>>>>>>" + DateUtil.now() + " param: " + param + ">>>>>>>>>>>>执行");        
        System.out.println("duZhuoJob1 is success");
        return ReturnT.SUCCESS;
    }
}

 此时调度平台日志输出没有问题

原因:

调度中心获取日志的方式是根据xxl_job_log记录的id,执行器yml文件中的logpath地址相互关联

 

 5.调度中心进行配置执行器

配置执行器,AppName要与执行器yml文件中的appname保持一致,名称自选。

对于注册方式,如果调度中心和执行器是本地服务可以选择自动注册

对于发布到服务器的,选择手动录入,机器地址修改为服务器地址,端口号为yml中的执行器port

 

6.配置任务

 执行器选择5中配置的执行器;任务描述可以随意编写;调度类型选择cron,定时执行;运行模式需要选择BEAN模式;JobHandler需要对应上定时任务的注解值

 

 7.调度日志

没有按照1-6步骤开发配置时,查询调度日志遇到如下两个问题

1.调度结果失败,没执行成功

 msg:xxl-job remoting error(connect timed out), for url 

解决方式:

将执行器服务打包放到服务器上,再修改执行器的机器地址

原因:

执行器一开始是在本地启动,调度中心上配置的执行器地址也是本地地址,而调度中心是在服务器上。服务器telnet本地接口时失败,只能把项目发服务器上可以调通。springboot项目发服务器可参考

简单将Springboot项目部署到linux服务器上_独酌先生QAQ的博客-CSDN博客

如果执行器和调度中心都是本地服务,一般不会有这问题

2.调度成功,执行失败

 解决方式:

对比执行器和调度器的版本是否一致

原因:

一开始执行器的引用依赖是2.2.0版本,而调度中心是拉取docker最新版本,版本不一致导致执行器已经执行任务,但是调度中心没有收到执行器返回的成功信息。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐