xxl-job执行器的注册

一、执行器注册流程

xxl-job执行器的注册

二、具体流程

1.注册监控线程

//类:JobRegistryHelper.java;方法:public void start()
registryMonitorThread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!toStop) {
                    try {
                        //获取自动注册型执行器
                        List<xxljobgroup> groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0);
                        if (groupList!=null && !groupList.isEmpty()) {

                            //&#x79FB;&#x9664;&#x6CE8;&#x518C;&#x4E2D;&#x5FC3;&#x6B7B;&#x4EA1;&#x7684;&#x5730;&#x5740;
                            List<integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
                            if (ids!=null && ids.size()>0) {
                                XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);
                            }

                            //&#x5237;&#x65B0;&#x6CE8;&#x518C;&#x4E2D;&#x5FC3;&#x6D3B;&#x8DC3;&#x7684;&#x5730;&#x5740;&#xFF0C;&#x5E76;&#x4FDD;&#x5B58;&#x4E3A;app&#x548C;&#x6CE8;&#x518C;&#x5730;&#x5740;&#x5217;&#x8868;&#x7684;&#x6620;&#x5C04;
                            HashMap<string, list<string>> appAddressMap = new HashMap<string, list<string>>();
                            List<xxljobregistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
                            if (list != null) {
                                for (XxlJobRegistry item: list) {
                                    if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
                                        String appname = item.getRegistryKey();
                                        List<string> registryList = appAddressMap.get(appname);
                                        if (registryList == null) {
                                            registryList = new ArrayList<string>();
                                        }

                                        if (!registryList.contains(item.getRegistryValue())) {
                                            registryList.add(item.getRegistryValue());
                                        }
                                        appAddressMap.put(appname, registryList);
                                    }
                                }
                            }

                            //&#x5237;&#x65B0;&#x6267;&#x884C;&#x5668;&#x5730;&#x5740;
                            for (XxlJobGroup group: groupList) {
                                List<string> registryList = appAddressMap.get(group.getAppname());
                                String addressListStr = null;
                                //&#x6CE8;&#x518C;&#x4E2D;&#x5FC3;&#x5B58;&#x5728;&#x6D3B;&#x8DC3;&#x7684;&#x5730;&#x5740;&#x5219;&#x66F4;&#x65B0;&#x4E3A;&#x6D3B;&#x8DC3;&#x5730;&#x5740;&#xFF0C;&#x5426;&#x5219;&#x66F4;&#x65B0;&#x4E3A;&#x7A7A;&#x5730;&#x5740;
                                if (registryList!=null && !registryList.isEmpty()) {
                                    Collections.sort(registryList);
                                    StringBuilder addressListSB = new StringBuilder();
                                    for (String item:registryList) {
                                        addressListSB.append(item).append(",");
                                    }
                                    addressListStr = addressListSB.toString();
                                    addressListStr = addressListStr.substring(0, addressListStr.length()-1);
                                }
                                group.setAddressList(addressListStr);
                                group.setUpdateTime(new Date());

                                XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);
                            }
                        }
                    } catch (Exception e) {
                        if (!toStop) {
                            logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);
                        }
                    }
                    try {
                        //&#x7761;&#x7720;&#x4E00;&#x4E2A;&#x5FC3;&#x8DF3;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#xFF0C;&#x96C6;&#x8BAD;&#x76D1;&#x63A7;&#x81EA;&#x52A8;&#x6CE8;&#x518C;&#x578B;&#x6267;&#x884C;&#x5668;&#x5217;&#x8868;
                        TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
                    } catch (InterruptedException e) {
                        if (!toStop) {
                            logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);
                        }
                    }
                }
                logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop");
            }
        });
        registryMonitorThread.setDaemon(true);
        registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread");
        registryMonitorThread.start();
</string></string></string></xxljobregistry></string,></string,></integer></xxljobgroup>

2.注册过程

1 初始化执行器

//XxlJobExecutor.java
private void initAdminBizList(String adminAddresses, String accessToken) throws Exception {
        if (adminAddresses!=null && adminAddresses.trim().length()>0) {
            for (String address: adminAddresses.trim().split(",")) {
                if (address!=null && address.trim().length()>0) {

                    AdminBiz adminBiz = new AdminBizClient(address.trim(), accessToken);

                    if (adminBizList == null) {
                        adminBizList = new ArrayList<adminbiz>();
                    }
                    adminBizList.add(adminBiz);
                }
            }
        }
    }
</adminbiz>

2 执行器端注册

    public void start(final String appname, final String address){

        //&#x7701;&#x7565;&#x90E8;&#x5206;

        registryThread = new Thread(new Runnable() {
            @Override
            public void run() {

                // registry
                while (!toStop) {
                    try {
                        RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), appname, address);
                        for (AdminBiz adminBiz: XxlJobExecutor.getAdminBizList()) {
                            try {
                //&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x6267;&#x884C;&#x5668;&#xFF0C;&#x53D1;&#x8D77;rpc&#x6CE8;&#x518C;&#x8BF7;&#x6C42;
                                ReturnT<string> registryResult = adminBiz.registry(registryParam);
                                if (registryResult!=null && ReturnT.SUCCESS_CODE == registryResult.getCode()) {
                                    registryResult = ReturnT.SUCCESS;
                                    logger.debug(">>>>>>>>>>> xxl-job registry success, registryParam:{}, registryResult:{}", new Object[]{registryParam, registryResult});
                    //&#x6CE8;&#x518C;&#x6210;&#x529F;&#x5219;&#x9000;&#x51FA;&#x5FAA;&#x73AF;
                                    break;
                                } else {
                    //&#x6CE8;&#x518C;&#x5931;&#x8D25;&#x5219;&#x6253;&#x5370;&#x65E5;&#x5FD7;&#xFF0C;&#x5C1D;&#x8BD5;&#x4E0B;&#x4E00;&#x4E2A;&#x6267;&#x884C;&#x5668;
                                    logger.info(">>>>>>>>>>> xxl-job registry fail, registryParam:{}, registryResult:{}", new Object[]{registryParam, registryResult});
                                }
                            } catch (Exception e) {
                                logger.info(">>>>>>>>>>> xxl-job registry error, registryParam:{}", registryParam, e);
                            }

                        }
                    } catch (Exception e) {
                        if (!toStop) {
                            logger.error(e.getMessage(), e);
                        }

                    }

                    try {
                        if (!toStop) {
                //&#x7761;&#x7720;&#x4E00;&#x4E2A;&#x5FC3;&#x8DF3;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#xFF0C;&#x7EE7;&#x7EED;&#x6CE8;&#x518C;
                            TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
                        }
                    } catch (InterruptedException e) {
                        if (!toStop) {
                            logger.warn(">>>>>>>>>>> xxl-job, executor registry thread interrupted, error msg:{}", e.getMessage());
                        }
                    }
                }

                //&#x79FB;&#x9664;&#x6CE8;&#x518C;&#x90E8;&#x5206;&#x7701;&#x7565;
            }
        });
        registryThread.setDaemon(true);
        registryThread.setName("xxl-job, executor ExecutorRegistryThread");
        registryThread.start();
    }
</string>

3 调度中心执行注册

//JobRegistryHelper.java
public ReturnT<string> registry(RegistryParam registryParam) {

        // valid
        if (!StringUtils.hasText(registryParam.getRegistryGroup())
                || !StringUtils.hasText(registryParam.getRegistryKey())
                || !StringUtils.hasText(registryParam.getRegistryValue())) {
            return new ReturnT<string>(ReturnT.FAIL_CODE, "Illegal Argument.");
        }

        //&#x4ECE;&#x7EBF;&#x7A0B;&#x6C60;&#x4E2D;&#x83B7;&#x53D6;&#x6CE8;&#x518C;&#x7EBF;&#x7A0B;&#x6267;&#x884C;&#x6CE8;&#x518C;
        registryOrRemoveThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                //&#x66F4;&#x65B0;&#x6CE8;&#x518C;&#x7ED3;&#x679C;
                int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
                if (ret < 1) {
                    //&#x66F4;&#x65B0;&#x5931;&#x8D25;&#x5219;&#x6DFB;&#x52A0;&#x6CE8;&#x518C;&#x7ED3;&#x679C;
                    XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());

                    // fresh
                    freshGroupRegistryInfo(registryParam);
                }
            }
        });

        return ReturnT.SUCCESS;
    }
</string></string>

Original: https://www.cnblogs.com/huanongying/p/14900890.html
Author: 花弄影
Title: xxl-job执行器的注册

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621876/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 米哈游大量招募新同学,校招提前批最后一天!

    米哈游大量招募新同学: 1.周末双休,工作日早十晚七,上班不打卡,全凭自觉; 2.团队氛围很不错,有成长空间,拒绝无意义加班和内卷; 3.免费晚餐线上订餐,不限量零食饮料还有咖啡和…

    Java 2023年6月8日
    087
  • redis 基于SpringBoot Reids 的工具类

    redis 基于SpringBoot Reids 的工具类 package com.mhy.springredis.utils; import org.springframewor…

    Java 2023年6月16日
    077
  • sqlserver数据库还原存储过程脚本

    &#x5B58;&#x50A8;&#x8FC7;&#x7A0B;&#x5FC5;&#x987B;&#x8981;&#…

    Java 2023年6月7日
    070
  • 实战项目中Java heap space错误的解决

    部标GPS通讯系统在上线之后,经过不断调试,终于稳定运行一段时间,后来又遇到了Java heap space错误异常!日志如下: 说明系统中有未释放的对象。如何找出这些未释放对象以…

    Java 2023年6月9日
    052
  • 日常踩坑

    有人的地方就有江湖,有代码的地方就有坑 一。集合 List与Set继承自Collection。Collection提供定义了一个移除元素的接口 可以看出,在Collection中该…

    Java 2023年6月9日
    0100
  • 紫书第三章习题 个人题解

    紫书chap3 虽鸽但到,第三章前面的习题比较简单,但还是可以积累到一些需要注意的点,总在格式上栽坑orz。后面的习题难度稍微大一些,但好在数据量比较小,一般暴力就能过。书上的翻译…

    Java 2023年6月5日
    078
  • 知乎问题:.NET AOT编译后能替代C++吗?

    标题上的Native库是指:Native分为静态库( (2)Remobjects Elements (https://www.remobjects.com/elements/) 收…

    Java 2023年6月5日
    0108
  • CentOs安装Nginx

    安装 gcc pcre pcre-devel zlib OpenSSL 安装 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需…

    Java 2023年6月15日
    081
  • 丰富Bean的配置

    关于Bean是如何配置的,大家并不陌生。毕竟前文曾有涉及,虽然比较粗浅。却也介绍了如何写份XML配置文件,告诉Spring容器怎样创建Bean,怎样注入依赖,等等。其中要点如下:1…

    Java 2023年6月5日
    066
  • windows使用nginx实现网站负载均衡测试实例

    如果你关注过nginx,必定知道nginx这个软件有什么用的,如果你的网站访问量越来越高,一台服务器已经没有办法承受流量压力,那就增多几台服务器来做负载吧。做网站负载可以买硬件设备…

    Java 2023年5月30日
    065
  • SpringBoot+MDC实现全链路调用日志跟踪

    实现HttpRequestInterceptor接口并重写process方法 ​ 如果调用线程中含有traceId,则需要将获取到的traceId通过request中的header…

    Java 2023年5月30日
    048
  • golang并发编程中select关键字的使用

    golang并发编程中select关键字的使用 select的使用类似于switch语句,有case和default分支。其中每个case对应一个通道的通信过程: 1、select…

    Java 2023年6月13日
    068
  • 如何把Spring学精通了?

    作为 Java 后端工程师,几乎都要用到 Spring,今天这篇文章是和大家说说如何学好 Spring。 在之前的一篇 Java 读书路线的文章中,我介绍过 Spring 的读书路…

    Java 2023年6月7日
    064
  • Java 从零开始实现一个画图板、以及图像处理功能,代码可复现

    Java 从零开始实现一个画图板、以及图像处理功能,代码可复现 这是一个学习分享博客,带你从零开始实现一个画图板、图像处理的小项目,为了降低阅读难度,本博客将画图板的一步步迭代优化…

    Java 2023年6月5日
    0108
  • Java8新特性之Stream

    Java8新特性之StreamStream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。Stream可以由数组…

    Java 2023年5月29日
    073
  • Docker 常用操作

    .Docker的基本操作 1.镜像操作 1.1.镜像名称 首先来看下镜像的名称组成: 镜名称一般分两部分组成:[repository]:[tag]。 在没有指定tag时,默认是la…

    Java 2023年6月7日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球