XxlJob09:路由策略
注:本系列源码分析基于XxlJob 2.3.0,gitee仓库链接:https://gitee.com/funcy/xxl-job.git.
在前面配置xxl-job任务时,提到过xxl-job的路由策略,本文将来分析这些策略。
在任务的编辑页面,可以配置路由策略:
所谓的路由策略,是指在多个executor存在时,选择哪一个executor来执行任务的策略。xxl-job支持的路由策略有如下几种:
第一个:选择第一个executor 最后一个:选择最后一个executor 轮询:依次选择executor 随机:随机选择一个executor 一致性hash:使用一致性hash算法来选择executor 最不经常使用:选择最不经常使用的executor 最近最久未使用:选择最久未使用的executor 故障转移:判断当前选择的executor是否可用,若不可用,则选择另一个executor 忙碌转移:判断当前选择的executor是否处于忙碌状态,若处于,则选择另一executor 分片广播:每一个executor都会执行任务 路由策略的选择 路由策略的选择在XxlJobTrigger#processTrigger,相关代码如下:
// 获取路由策略枚举类,jobInfo.getExecutorRouteStrategy() 来自于数据库 ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null); .... // 路由策略的处理,区分分片广播与其他策略 if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) { if (index < group.getRegistryList().size()) { address = group.getRegistryList().get(index); } else { address = group.getRegistryList().get(0); } } else { // 执行策略,仅仅只是为了得到执行器的地址 routeAddressResult = executorRouteStrategyEnum.getRouter() .route(triggerParam, group.getRegistryList()); if (routeAddressResult.getCode() == ReturnT.SUCCESS_CODE) { address = routeAddressResult.getContent(); } } 在任务的配置时,任务的路由策略会保存在数据库中,在XxlJobTrigger#processTrigger方法中,会把路由策略拿出来以便获取路由策略的枚举类,jobInfo.getExecutorRouteStrategy()就是数据库中保存的策略。