public boolean isLeader(String uuid, List<ScheduleStrategyRunntime> factoryList) { long no = Long.parseLong(uuid.substring(uuid.lastIndexOf("$") + 1)); for (ScheduleStrategyRunntime server : factoryList) { if (no > Long.parseLong(server.getUuid().substring(server.getUuid().lastIndexOf("$") + 1))) { return false; } } return true; }
public void reRunScheduleServer() throws Exception { for (ScheduleStrategyRunntime run : this.scheduleStrategyManager.loadAllScheduleStrategyRunntimeByUUID(this.uuid)) { AtomicInteger num = this.pauseTaskType.get(run.getTaskType()); if (num != null && num.get() > 0) { // 暂停状态 num.set(run.getRequestNum()); } else { // 是运行状态 int count = 1; for (TBScheduleManager manager : this.managerMap.values()) { if (manager.getScheduleServer().getTaskType().equals(run.getTaskType())) { if (count > run.getRequestNum()) { // 多了,删除调度器 this.unregister(manager); manager.stopScheduleServer(); } else { count = count + 1; } } } // 不足,增加调度器 for (int i = count; i <= run.getRequestNum(); i++) { String baseTaskType = TBScheduleManager.splitBaseTaskTypeFromTaskType(run.getTaskType()); if (this.scheduleDataManager.loadTaskTypeBaseInfo(baseTaskType) == null) { String message = "不能识别的任务名称:" + baseTaskType; this.scheduleStrategyManager.updateStrategyRunntimeErrorMessage( run.getTaskType(), this.uuid, message); logger.error(message); continue; } this.createTBScheduleManager( baseTaskType, TBScheduleManager.splitOwnsignFromTaskType(run.getTaskType())); } } } }
/** * 根据策略重新分配调度任务的机器 * * @throws Exception */ public void assignScheduleServer() throws Exception { for (ScheduleStrategyRunntime run : this.scheduleStrategyManager.loadAllScheduleStrategyRunntimeByUUID(this.uuid)) { List<ScheduleStrategyRunntime> factoryList = this.scheduleStrategyManager.loadAllScheduleStrategyRunntimeByTaskType(run.getTaskType()); if (factoryList.size() == 0 || this.isLeader(this.uuid, factoryList) == false) { continue; } ScheduleStrategy scheduleStrategy = this.scheduleStrategyManager.loadStrategy(run.getTaskType()); int[] nums = new int[factoryList.size()]; if (scheduleStrategy.getNumOfSingleServer() > 0) { int count = 0; for (int i = 0; i < factoryList.size(); i++) { if (scheduleStrategy.getAssignNum() - count > scheduleStrategy.getNumOfSingleServer()) { nums[i] = scheduleStrategy.getNumOfSingleServer(); } else { nums[i] = scheduleStrategy.getAssignNum() - count; } count = count + nums[i]; } } else { int numOfSingle = scheduleStrategy.getAssignNum() / factoryList.size(); int otherNum = scheduleStrategy.getAssignNum() % factoryList.size(); for (int i = 0; i < factoryList.size(); i++) { if (i < otherNum) { nums[i] = numOfSingle + 1; } else { nums[i] = numOfSingle; } } } for (int i = 0; i < factoryList.size(); i++) { ScheduleStrategyRunntime factory = factoryList.get(i); // 更新请求的服务器数量 this.scheduleStrategyManager.updateStrategyRunntimeReqestNum( run.getTaskType(), factory.getUuid(), nums[i]); } } }