package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; import java.util.List; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * Created by xuxueli on 17/3/10. */ public class ExecutorRouteRound extends ExecutorRouter { private static ConcurrentMap routeCountEachJob = new ConcurrentHashMap(); private static long CACHE_VALID_TIME = 0; private static int count(int jobId) { // cache clear if (System.currentTimeMillis() > CACHE_VALID_TIME) { routeCountEachJob.clear(); CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24; } // count++ Integer count = routeCountEachJob.get(jobId); count = (count==null || count>1000000)?(new Random().nextInt(100)):++count; // 初始化时主动Random一次,缓解首次压力 routeCountEachJob.put(jobId, count); return count; } @Override public ReturnT route(TriggerParam triggerParam, List addressList) { String address = addressList.get(count(triggerParam.getJobId())%addressList.size()); return new ReturnT(address); } }