xxl-job(spring boot)客户端执行器初始化bean与接收rpc请求处理流程简单分析

本文分析了xxl-job在spring boot客户端的接入流程,包括配置、扫描jobHandler、启动XxlJobSpringExecutor。详细探讨了从XxlJobSpringExecutor的start()方法开始,涉及的日志清理、触发器回调线程、RPC服务启动、注册到调度中心、处理RPC请求以及JobThread的运行逻辑。
摘要由CSDN通过智能技术生成

xxl-job客户端如何接入spring boot,按xxl-job官方给出来的demo,需要以下几个过程

  1. 首先是配置
  2. 接着配置扫描地址,把对应的jobHandler加载到spring容器中
  3. 配置XxlJobSpringExecutor,接着启动项目即可
1、======================================================================
### 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,http://192.168.1.168:1888/xxl-job-admin

### xxl-job executor address
xxl.job.executor.appname=app-job-executor
xxl.job.executor.ip=
xxl.job.executor.port=9998

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

### xxl-job log path
xxl.job.executor.logpath=D:/xxl-job
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1
2、=========================================================================
@Configuration
@ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")
3、=========================================================================
@Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppName(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

ok,那我们分析一下主要的init流程与接收调度中心调度请求的流程

1、首先定位到XxlJobSpringExecutor的initMethod,start()

@Override
    public void start() throws Exception {

        //初始化jobHandler
        initJobHandlerRepository(applicationContext);

        // refresh GlueFactory
        GlueFactory.refreshInstance(1);


        // super start
        super.start();
    }

private void initJobHandlerRepository(ApplicationContext applicationContext){
        if (applicationContext == null) {
            return;
        }

        // 从spring中拿到JobHandler注解的bean map
        Map<String, Object> serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class);

        if (serviceBeanMap!=null && serviceBeanMap.size()>0) {
            for (Object serviceBean : serviceBeanMap.values()) {
                //判断是否IJobHandler
                if (serviceBean instanceof IJobHandler){
                    String name = serviceBean.getClass().getAnnotation(JobHandler.class).value();
                    IJobHandler handler = (IJobHandler) serviceBean;
                    if (loadJobHandler(name) != null) {
                        throw new RuntimeException("xxl-job jobhandler naming conflicts.");
                    }
                    //拿到JobHandler注解的名字,以及IJobHandler放入jobHandlerRepository中
                    registJobHandler(name, handler);
                }
            }
        }
    }
// ---------------------- job handler repository ----------------------
    private static ConcurrentHashMap<String, IJobHandler> jobHandlerRepository = new ConcurrentHashMap<String, IJobHandler>();
    public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
        logger.info(">>>>>>>>>>> xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
        return jobHandlerRepository.put(name, jobHandler);
    }

 2、调用父类XxlJobExecutor的start()方法,首先我们看initAdminBizList();

private static List<AdminBiz> adminBizList;
//拿到我们刚才设置的adminAddresses列表(xxl.job.admin.addresses)
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) {
                    //addressUrl地址:http://127.0.0.1:8080/xxl-job-admin/api
                    String addressUrl = address.concat(AdminBiz.MAPPING);
                    //通过XxlRpcReferenceBean#getObject()设置动态代理,主要用来请求和处理rpc信息,这里使用的是JETTY,JettyServer和JettyClient去处理,还支持mima,netty等的扩展
                    AdminBiz adminBiz = (AdminBiz) new XxlRpcReferenceBean(NetEnum.JETTY, Serializer.SerializeEnum.HESSIAN.getSerializer(), CallType.SYNC,
                            AdminBiz.class, null, 10000, addressUrl, accessToken, null).getObject();

                    if (adminBizList == null) {
                        adminBizList = new ArrayList<AdminBiz>();
                    }
                    //放入adminBizList中
                    adminBizList.add(adminBiz);
                }
            }
        }
    }
//XxlRpcReferenceBean#getObject()
public Object getObject() {
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{this.iface}, new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //....代码太多,略过
                }
            }
        });
    }

3、启动日志清理守护线程

//感兴趣可以自己看
JobLogFileCleanThread.getInstance().start(logRetentionDays);

4、启动触发器回调守护线程

TriggerCallbackThread.
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值