XxlJobSpringExecutor
![](https://i-blog.csdnimg.cn/blog_migrate/0405e660ed7e33ff58fc29c85b18a203.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7339a18fe427f8a240f3328912cd50a1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/28ea36461a90ac0c4fc09f60f3a88f4c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e84bb4237fc374b31d63668bb169e4c1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/048d2506a10530d781c213385c9139ca.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5b4c74dc9cb14e17e10e334270ec987b.png)
XxlRpcProviderFactory
看名字就知道这个类是可以返回Rpc调用服务提供端的工厂类,接上文,看他的initRpcProvider方法。
![](https://i-blog.csdnimg.cn/blog_migrate/5f557d997b5fed89dfec7efddfce3d83.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6bfccc6cbb3310bd7685818fd6a45658.png)
此时的ServiceRegistry为ExecutorServiceRegistry,调用其start,以30秒的间隔和调度中心进行心跳通知,然后调用server的start方法,此时server为NettyHttpServer。
整个代码结构就是用netty启动了个服务,来看最后一个ChannelHandler,NettyHttpServerHandler。
调用私有方法process。
这里调用了xxlRpcProviderFactory的invokeService方法完成了服务实现的反射调用。
从serviceData中拿到我们之前调用addService方法添加的服务实现类,这里是ExecutorBizImpl,这里反射调用的方法是run。
ExecutorBizImpl
这个类实现了ExecutorBiz接口,看接口定义的方法,主要是作为执行器,提供给调度中心几个接口方法。
重点来看run方法。
首先XxlJobExecutor内部会有个以jobId为key,执行这个任务的线程为value的字段jobThreadRepository,我们首先去尝试的获取当前正在执行这个任务的线程,如果有,那就根据任务设置的运行模式进行处理,如下图。
如果没有正在执行此任务的线程,那就调用XxlJobExecutor.registJobThread()启动一个线程,最后将任务数据推送给这个可能是从jobThreadRepository获取到的也可能是新创建的线程,如下图。
JobThread的run方法会从triggerQueue里poll出任务,然后用之前设置的 handler进行execute的方法调用,并利用idleTimes字段进行线程无任务空转的次数控制,如下图。
至此,执行器完成了启动,暴露ExecutorBiz服务,接收任务调度数据TriggerParam,并在JobThread线程中完成任务配置的业务handler的执行。