调度中心触发任务之后,他的调用链如下
RemoteHttpJobBean> executeInternal > XxlJobTrigger > trigger ,
通过之前的分析xxl-job 源码解读 (二) , 我们可以了解到,xxl-job他的路由策略主要发生在trigger这个方法中
|
上面的代码主要讲了分片广播这个策略的实现以及xxl-job的其他路由策略的调用位置在哪里。
这个是xxl-job路由策略非常重要的一个类, 该类通过枚举的方式,把路由key, 和策略实现类进行了一个聚合、
ExecutorRouteStrategyEnum
|
通过源码回顾,我们可以清晰的看到,当系统判断当前任务的路由策略是分片广播时, 就会遍历执行器的集群机器列表,
给每一台机器都发送执行消息,分片总数为集群机器数量,分片标记从0开始,上面的代码已经非常清楚了,此处不再赘述。
由上面对ExecutorRouteStrategyEnum的分析,我们可以看到,该策略对应的是 这个ExecutorRouteFirst执行策略类。 主要看
routeRun 这个方法
ExecutorRouteFirst
|
直接 从执行机集群列表的list里面取最后一个,源码如下
ExecutorRouteLast
|
主要看ExecutorRouteRound这个类里面的代码
ExecutorRouteRound
|
随机这个策略比较简单,通过在集群列表的大小内随机拿出一台机器来执行,比较简单,此处不再赘述
ExecutorRouteRandom
|
在讲这个策略之前,先说一下一致性Hash算法 ,
先构造一个长度为2^32的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 2^32-1])
将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 2^32-1]),接着
在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。
详细介绍: http://blog.csdn.net/u010412301/article/details/52441400
分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
这个地方使用的Hash方法是作者自己写的,因为String的hashCode可能重复,需要进一步扩大hashCode的取值范围
ExecutorRouteConsistentHash
|
单个JOB对应的每个执行器,使用频率最低的优先被选举
ExecutorRouteLFU
|
单个JOB对应的每个执行器,最久为使用的优先被选举 , 此处使用的是linkHashMap来实现LRU算法的。
通过linkHashMap的每次get/put的时候会进行排序,最新操作的数据会在最后面。 从而取第一个数据就
代表是最久没有被使用的
ExecutorRouteLRU
|
这个策略比较简单,遍历集群地址列表,如果失败,则继续调用下一台机器,成功则跳出循环,返回成功信息
ExecutorRouteFailover
|
这个策略更上面那个故障转移的原理一致,只不过不同的是,故障转移是判断机器是否存活, 二忙碌转移是想执行器发送消息判断该任务
对应的线程是否处于执行状态。
ExecutorRouteFailover
|
看一下执行器那边的idleBeat代码实现
ExecutorBizImpl
|
sharedCode源码交流群,欢迎喜欢阅读源码的朋友加群,添加下面的微信, 备注”加群“ 。