原理篇--一次定时任务的触发执行&结果返回--(终章)

文章目录

  • 前言
  • [一、xxl-job 服务端的启动:](#一、xxl-job 服务端的启动:)
    • [1.1 xxl-job-admin application.properties 配置:](#1.1 xxl-job-admin application.properties 配置:)
    • [1.2 xxl-job-admin 项目启动](#1.2 xxl-job-admin 项目启动)
  • 二、执行器端启动:
    • [2.1 引入库](#2.1 引入库)
    • [2.2 application.properties 配置:](#2.2 application.properties 配置:)
    • [2.3 XxlJobConfig 配置:](#2.3 XxlJobConfig 配置:)
    • [2.4 任务执行逻辑:](#2.4 任务执行逻辑:)
    • [2.5 启动执行器项目:](#2.5 启动执行器项目:)
  • 三、任务的添加:
    • [3.1 登录到xxl-job admin:](#3.1 登录到xxl-job admin:)
    • [3.2 任务管理新增任务:](#3.2 任务管理新增任务:)
  • 四、任务的执行:
    • [4.1 xxl-job 执行器端执行器的注册:](#4.1 xxl-job 执行器端执行器的注册:)
    • [4.2 xxl-job 服务端任务的扫描:](#4.2 xxl-job 服务端任务的扫描:)
    • [4.3 执行器端任务的执行:](#4.3 执行器端任务的执行:)
    • [4.4 任务执行结果返回:](#4.4 任务执行结果返回:)
  • 总结

前言

之前的文章我们将xxl-job 服务端和执行端 各个类的工作内容进行了介绍,本篇文章将其串联,介绍一个任务的完整执行。


一、xxl-job 服务端的启动:

1.1 xxl-job-admin application.properties 配置:

以下内容只例举出需要需要的地方

properties 复制代码
### xxl-job, datasource 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3406/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=ddsoft
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

### xxl-job, access token 访问令牌配置
xxl.job.accessToken=lgx123456

1.2 xxl-job-admin 项目启动

二、执行器端启动:

2.1 引入库

xml 复制代码
<!-- xxl-job-core -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>${project.parent.version}</version>
</dependency>

2.2 application.properties 配置:

以下内容只例举出需要需要的地方

properties 复制代码
# 为空则关闭自动注册: 服务端通信地址
xxl.job.admin.addresses=http://127.0.0.1:8082/xxl-job-admin,http://127.0.0.1:8083/xxl-job-admin
### xxl-job, access token 访问令牌设置
xxl.job.accessToken=lgx123456
### xxl-job executor appname
### 执行器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
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 "IP:PORT" 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### xxl-job executor server-info
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=172.29.8.200
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999

2.3 XxlJobConfig 配置:

java 复制代码
@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();
     */

}

2.4 任务执行逻辑:

java 复制代码
@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);


    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");

        for (int i = 0; i < 5; i++) {
            XxlJobHelper.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        // default success
    }
}

2.5 启动执行器项目:

三、任务的添加:

3.1 登录到xxl-job admin:

http://localhost:port/xxl-job-admin/toLogin

账号/密码: admin/123456

3.2 任务管理新增任务:

然后在 "操作" 里启动任务;

四、任务的执行:

4.1 xxl-job 执行器端执行器的注册:

执行器端项目在启动完成后,在实例化bean 的时候 在 XxlJobExecutor 的 start() 方法中,会进行执行器的注册和 netty 服务端的开启:

最终在ExecutorRegistryThread 可以看到执行器 注册的代码:

注册成功在xxl-job admin 端 执行器管理列表可以看到 执行器注册的地址:

4.2 xxl-job 服务端任务的扫描:

在服务端项目启动后 会在JobScheduleHelper scheduleThread 线程不断的去轮询,获取到需要触发执行的任务,通过调用 JobTriggerPoolHelper.trigger 方法,最终发送http 请求发送给到执行器端的服务中;

这部分内容可见: 原理篇-- 定时任务xxl-job-服务端(admin)项目启动过程--JobScheduleHelper初始化 (8)

4.3 执行器端任务的执行:

执行器端的netty 服务会接收到,服务端发送的http 请求,并在 EmbedHttpServerHandler 类中的 channelRead0 进行任务的执行;

通过run 方法,获取到对应的handler 处理器,进行反射调用,最终调用到我们自己的系统业务;并记录任务执行结果的日志;

任务执行的详细过程 :原理篇-- 定时任务xxl-job--任务执行-run(5)

4.4 任务执行结果返回:

执行器端会将任务执行的结果回调给服务端,工作内容可见: 原理篇-- 定时任务xxl-job-执行器项目启动过程--TriggerCallbackThread 初始化(3)

发送http 请求到服务端:

xxljob 服务端 接收请求并处理:

JobApiController:

这样我们就可以再在调度日志列表页查看执行结果:


总结

本文对,一次定时任务的触发执行&结果返回的过程进行介绍。

相关推荐
ChinaRainbowSea几秒前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
小游鱼KF3 分钟前
Spring学习前置知识
java·学习·spring
扎克begod7 分钟前
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
java·开发语言·python
青灯文案19 分钟前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
我就是程序猿19 分钟前
tomcat的配置
java·tomcat
阳光阿盖尔25 分钟前
EasyExcel的基本使用——Java导入Excel数据
java·开发语言·excel
二十雨辰26 分钟前
[苍穹外卖]-12Apache POI入门与实战
java·spring boot·mybatis
程序员皮皮林26 分钟前
开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)
java·pdf·开源·apache
蔚一27 分钟前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则
liang899932 分钟前
SpringSecurity原理解析(七):权限校验流程
java·开发语言