• xxljob客户端启动分析


    1.xxl客户端的核心配置文件

    @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.可以看到里面的xxlJobExecutor方法返回了一个为XxlJobSpringExecutor类型的Bean对象

    3.我们来看一下XxlJobSpringExecutor类型

    4.我们看下afterSingletonsInstantiated方法里都做了什么

    4.1 initJobHandlerMethodRepository

    初始化jobHandler的方法到Respository(存储中心)中,传递参数spring的context对象


    我们先看一下new MethodJobHandler这个类

    我们再回到上面的这句

    点击registJobHandler方法,看内部做了什么

    4.2 GlueFactory.refreshInstance

    GlueFactory 刷新实例,glue玩法是把要跑的任务代码维护到了xxl-job的数据库中,平时使用场景不多

    4.3 super.start()

    调用父类XxlJobExecutor的start方法

    4.3.1 XxlJobFileAppender.initLogPath(logPath);

    初始化日志路径

    4.3.2 initAdminBizList(adminAddresses, accessToken);

    初始化连接到admin的客户端,客户端可以连接多个admin地址

    我们看下AdminBizClient对象的定义

    是不是很清晰了,到admin客户端的连接里有callback,registry,registryRemove三个方法,分别发送http的post请求,来与服务器端进行数据交互,完成回调,注册,移除注册的功能逻辑

    4.3.3 JobLogFileCleanThread.getInstance().start(logRetentionDays);

    新起了一个名为xxl-job, executor JobLogFileCleanThread的线程,用于按照配置的日志保留条件进行间歇的检测,每个1天检查一次

    4.3.4 TriggerCallbackThread.getInstance().start();

    触发器回调线程

    我们点doCallback进去看看里面的逻辑

    4.3.5 initEmbedServer(address, ip, port, appname, accessToken);

    初始化客户端本地rpc服务

    我们看下EmbedServer的设计


    我们看下startRegistry方法

    发现是起了一个注册线程,每隔30秒与admin服务端交互,发送注册请求,不断刷新自己的状态

    当stop标志位变为stop的时候,退出while循环,进行取消注册的逻辑

  • 相关阅读:
    Spring Boot 自定义属性 以及 乱码问题
    IDEA 修改文件编码
    Gojs简单例子
    无法转换json问题 Error: Model.nodeDataArray value is not an instance of Array or NodeList or HTMLCollection
    java json转换
    git设置HTTP代理
    thymeleaf中的日期格式化
    thymeleaf:字符串Strings常见的使用方法
    thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误
    Thymeleaf教程 (十二) 标签内,js中使用表达式
  • 原文地址:https://www.cnblogs.com/PythonOrg/p/16083145.html
Copyright © 2020-2023  润新知