package com.hqyg.job; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.api.transaction.CuratorTransaction; import org.apache.curator.framework.api.transaction.CuratorTransactionFinal; import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.curator.utils.ZKPaths; import org.junit.Before; import org.junit.Test; import com.hqyg.disjob.common.Constants; import com.hqyg.disjob.common.util.LocalHost; import com.hqyg.disjob.common.util.LoggerUtil; import com.hqyg.disjob.register.center.pool.ConsoleCuratorClient; import com.hqyg.disjob.register.center.pool.ThreadLocalClient; import com.hqyg.disjob.register.domain.Job; import com.hqyg.disjob.register.job.JobOperationService; import com.hqyg.disjob.register.repository.ZnodeApi; import com.hqyg.disjob.register.repository.ZnodeApiCuratorImpl; import com.hqyg.disjob.slaver.utils.SlaveUtils; import com.google.gson.Gson; import com.hqyg.BaseJunitTest; public class JobActive extends BaseJunitTest{ @Resource public JobOperationService jobOperationService; @Resource private ThreadLocalClient threadLocalClient; CuratorFramework client = null; @Before public void init(){ LocalHost localHost = new LocalHost(); client = CuratorFrameworkFactory.builder() .connectString("10.40.6.100:2181,10.40.6.101:2181,10.40.6.102:2181") .sessionTimeoutMs(5000) .retryPolicy(new ExponentialBackoffRetry(1000, 3)) .build(); client.start(); threadLocalClient.setCuratorClient(); ConsoleCuratorClient curatorClient = threadLocalClient.getCuratorClient(); if (null == curatorClient || !curatorClient.isConnected()) { System.out.println("get ZK client failed!"); return ; } } //生成job @Test public void saveJob(){ ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); for(int i =1;i<=1000;i++){ int val = (i-1)/20 + 1 ; String groupName = "grouptest_"+val; String jobName = "jobtest_"+i; String prividerPath = "/php-ejob/rpc"+"/"+groupName+"/"+jobName+"/providers"; znode.createPersistent(client, prividerPath+"/10.40.6.89:9501", "ejob://10.40.6.89:9501/test1?serverGroup=oms1&phpFilePath=/usr/local/php-test/TestService.php&className=TestService&methodName=test&version=0.1"); } System.out.println("create rpc and copy job success"); try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //激活 @Test public void activeJob(){ for(int i =1;i<=600;i++){ int val = (i-1)/20 + 1 ; String groupName = "cronJob_"+val; String jobName = "fireNowJobTemp_"+i; Job job = new Job(); job.setGroupName(groupName); job.setJobName(jobName); job.setJobStatus(0); if (i <= 600) { job.setCronExpression("0 0/5 * * * ?"); } else { job.setCronExpression("0 0/50 * * * ?"); } job.setDesc("test " + groupName + "-" + jobName); jobOperationService.updateJob(job); } System.out.println("update success"); try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { e.printStackTrace(); } } @Test public void testClearJob() throws Exception{ CuratorTransaction transaction = client.inTransaction(); // CuratorTransactionFinal curatorTransactionFinal = new org.apache.curator.framework.imps.CuratorTransactionImpl (client); SlaveUtils.clearAllClustersJobs(client,transaction); CuratorTransactionFinal curatorTransactionFinal = (CuratorTransactionFinal)transaction; //没办法 curatorTransactionFinal.commit(); ZnodeApiCuratorImpl znodeApi = new ZnodeApiCuratorImpl(); /* znodeApi.deleteByRecursion(client, "/ejob-dev/job"); znodeApi.deleteByRecursion(client, "/ejob-dev/scheduler/slave"); znodeApi.deleteByRecursion(client, "/ejob-dev/rpc"); znodeApi.makeDirs(client, "/ejob-dev/rpc"); znodeApi.makeDirs(client, "/ejob-dev/job"); znodeApi.makeDirs(client, "/ejob-dev/scheduler/slave"); */ znodeApi.deleteByRecursion(client, "/ejob/job"); //znodeApi.deleteByRecursion(client, "/ejob/scheduler/slave"); znodeApi.deleteByRecursion(client, "/ejob/rpc"); znodeApi.makeDirs(client, "/ejob/rpc"); znodeApi.makeDirs(client, "/ejob/job"); // znodeApi.makeDirs(client, "/ejob/scheduler/slave"); System.out.println("清除完成"); } @Test public void testRpcJobCopy(){ ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); for(int i =1;i<Integer.MAX_VALUE;i++){ String groupName = ""; if(i%10==0){ groupName = "grouptest"+5; } else if(i%10==5){ groupName = "grouptest"+6; } else if(i%10==3){ groupName = "grouptest"+7; }else{ groupName = "grouptest"+8; } String jobName = "jobtest"+i; String prividerPath = "/ejob/rpc"+"/"+groupName+"/"+jobName+"/providers"; //System.out.println(prividerPath); //System.out.println(prividerPath+"/192.168.1."+i+":8080"); //znode.makeDirs(client, prividerPath); //znode.createEphemeral(client, prividerPath+"/192.168.1."+i+":8080", "ejob://10.40.6.89:9501/test1?serverGroup=oms1&phpFilePath=/usr/local/php-test/TestService.php&className=TestService&methodName=test&version=0.1"); try{ znode.createPersistent(client, prividerPath+"/10.40.6.89:9501", "ejob://10.40.6.89:9501/test1?serverGroup=oms1&phpFilePath=/usr/local/php-test/TestService.php&className=TestService&methodName=test&version=0.1"); }catch(Exception e){ e.printStackTrace(); System.out.println("i====================="+i); break; } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } String str = znode.getData(client, "/ejob/job/"+groupName+"/"+jobName+"/config"); if(StringUtils.isEmpty(str)){ System.out.println("not copy job groupName:"+groupName +" , jobName:"+jobName); } } System.out.println("======================over================="); try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void deleteByRecursion() throws Exception{ ZnodeApi znodeApi = new ZnodeApiCuratorImpl(); /* znodeApi.deleteByRecursion(client, "/ejob/scheduler/master"); znodeApi.makeDirs(client, "/ejob/scheduler/master");*/ //znodeApi.createPersistent(client, "/ejob/scheduler/master/host", "10.40.6.100"); znodeApi.deleteByRecursion(client, "/ejob/job"); // znodeApi.deleteByRecursion(client, "/ejob/scheduler/slave"); znodeApi.deleteByRecursion(client, "/ejob/rpc"); znodeApi.makeDirs(client, "/ejob/rpc"); znodeApi.makeDirs(client, "/ejob/job"); // znodeApi.makeDirs(client, "/ejob/scheduler/slave"); /* znodeApi.deleteByRecursion(client, "/ejob/scheduler/master"); znodeApi.makeDirs(client, "/ejob/scheduler/master");*/ //znodeApi.deleteByRecursion(client, "/ejob/scheduler/master"); // znodeApi.makeDirs(client, "/ejob/scheduler/master"); /*znodeApi.deleteByRecursion(client, "/ejob/scheduler/master"); znodeApi.makeDirs(client, "/ejob/scheduler/master"); znodeApi.createPersistent(client, "/ejob/scheduler/master/host", "10.40.6.100");*/ /* znodeApi.deleteByRecursion(client, "/ejob/rpc"); znodeApi.deleteByRecursion(client, "/ejob/job"); znodeApi.deleteByRecursion(client, "/ejob/scheduler/slave"); znodeApi.makeDirs(client, "/ejob/rpc"); znodeApi.makeDirs(client, "/ejob/job"); znodeApi.makeDirs(client, "/ejob/scheduler/slave"); */ // znodeApi.makeDirs(client, "/ejob/scheduler/master"); /*znodeApi.deleteByRecursion(curatorClient, "/ejob/job/oms1"); znodeApi.deleteByRecursion(curatorClient, "/ejob/job/oms2"); znodeApi.deleteByRecursion(curatorClient, "/ejob/job/oms3");*/ /* znodeApi.deleteByRecursion(curatorClient, "/ejob/job/oms6"); znodeApi.deleteByRecursion(curatorClient, "/ejob/job/oms7"); */ /*znodeApi.deleteByRecursion(curatorClient, "/ejob/rpc/oms1"); znodeApi.deleteByRecursion(curatorClient, "/ejob/rpc/oms2"); znodeApi.deleteByRecursion(curatorClient, "/ejob/rpc/oms3"); znodeApi.deleteByRecursion(curatorClient, "/ejob/rpc/oms6"); znodeApi.deleteByRecursion(curatorClient, "/ejob/rpc/oms7");*/ //znodeApi.deleteByRecursion(client, "/ejob/scheduler/master"); // znodeApi.deleteByZnode(client, "/ejob/scheduler/slave/192.168.56.1"); //znodeApi.deleteByZnode(client, "/ejob/scheduler/slave/192.168.56.1/status"); // znodeApi.deleteByRecursion(client, "/ejob/scheduler/slave/192.168.56.1"); // znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/192.168.56.1"); /* znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/10.40.6.185"); znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/10.40.6.184"); znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/10.40.6.183"); znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/192.168.56.1"); znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/10.37.1.214"); */ // znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/192.168.238.1"); // znodeApi.deleteByRecursion(curatorClient, "/ejob/scheduler/slave/192.168.56.1"); //znodeApi.deleteByRecursion(curatorClient, "/ejob/rpc/test"); } @Test public void saveJob1(){ ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); String groupName = ""; for(int i =1;i<3;i++){ if(i%2 == 0){ groupName = "aaaaa"+i; }else{ groupName = "huanqiujob"+i; } String jobName = "jobtest"+i; String prividerPath = "/ejob/rpc"+"/"+groupName+"/"+jobName+"/providers"; System.out.println(prividerPath); System.out.println(prividerPath+"/192.168.1."+i+":8080"); //znode.makeDirs(client, prividerPath); //znode.createEphemeral(client, prividerPath+"/192.168.1."+i+":8080", "ejob://10.40.6.89:9501/test1?serverGroup=oms1&phpFilePath=/usr/local/php-test/TestService.php&className=TestService&methodName=test&version=0.1"); znode.createPersistent(client, prividerPath+"/10.40.6.89:9501", "ejob://10.40.6.89:9501/test1?serverGroup=oms1&phpFilePath=/usr/local/php-test/TestService.php&className=TestService&methodName=test&version=0.1"); //znode.createPersistent(client, privider, null); } try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //激活 @Test public void activeJob1(){ ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); String groupName = ""; for(int i =1;i<8;i++){ if(i%2 == 0){ groupName = "testgroup11"; }else{ groupName = "testgroup22"; } String jobName = "jobtest"+i; Job job = new Job(); job.setGroupName(groupName); job.setJobName(jobName); if(i<5){ job.setCronExpression("0 29 * * * ?"); }else{ job.setCronExpression("0 30 * * * ?"); } job.setDesc("test "+groupName + "-"+jobName); jobOperationService.updateJob(job); //znode.createPersistent(client, privider, null); } try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //暂停 @Test public void allstop(){ ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); String jobNode = "/ejob/job"; List<String> groupList = znode.getChildren(client, jobNode); if(CollectionUtils.isNotEmpty(groupList)){ for(String groupName :groupList ){ String groupNode = jobNode + "/" + groupName; List<String> jobAll = znode.getChildren(client, groupNode) ; if(CollectionUtils.isNotEmpty(jobAll)){ for(String jobName:jobAll){ String job1Node = groupNode+"/"+jobName; String configNode = job1Node+ "/" + "config"; String json = znode.getData(client, configNode); Job zkJob = new Job(); if(StringUtils.isNotEmpty(json)){ zkJob = new Gson().fromJson(json, Job.class); //jobOperationService.suspendJob(zkJob); suspendJob(zkJob, client); } } } } } } public void suspendJob(Job job,CuratorFramework client){ ZnodeApiCuratorImpl znodeApi = new ZnodeApiCuratorImpl(); if( null == job){ LoggerUtil.warn("suspendJob job,job is null"); return ; } job.setJobStatus(3); LoggerUtil.info("begin update job is "+job.toString()); try{ CuratorTransaction transaction = znodeApi.startTransaction(client); String group = job.getGroupName(); String jobName = job.getJobName(); //把JOB暂停->找到该job所在的ip,找到该slave上的该job然后移除该job LoggerUtil.info("job be suspend, job is "+job.toString()); String jobPath = znodeApi.makePath(Constants.ROOT, Constants.APP_JOB_NODE_ROOT,Constants.PATH_SEPARATOR+group,Constants.PATH_SEPARATOR+jobName, Constants.APP_JOB_NODE_CONFIG); String data = znodeApi.getData(client, jobPath); if(StringUtils.isNotEmpty(data)){ Job stopJob = new Job(); stopJob = new Gson().fromJson(data, Job.class); //虽然slave上的该job被移除了,/ejob/job的config记录了该job状态,config上的slaveip记录了是从哪台机器暂停remove的,故不改config的slaveip值 String slaveIp = stopJob.getSlaveIp(); String jobNode = znodeApi.makePath(Constants.ROOT, Constants.EJOB_SERVER_NODE_ROOT,Constants.EJOB_SERVER_NODE_SLAVE,Constants.PATH_SEPARATOR+slaveIp,Constants.EJOB_SERVER_NODE_SLAVE_EXECUTION,Constants.PATH_SEPARATOR+group); String jobs = znodeApi.getData(client, jobNode); if(!StringUtils.isEmpty(jobs)){ //得到 /slave/job上某group上移除该job值后得到的job值 String newJob = removeJobName(jobs, jobName); //如果group下的job的值为空串->单个job被移除,则直接remove掉该job节点 if("".equals(newJob)){ //znodeApi.deleteByZnode(client, jobNode); znodeApi.addDeleteToTransaction(transaction, jobNode); } //不为空代表该group移除该job后还有其他job此时更新该/group/job节点的值 else{ // znodeApi.update(client, jobNode, newJob); znodeApi.addUpdateToTransaction(transaction, jobNode, newJob); } } } //更改ejob/job的对应job节点的值 // SlaveUtils.updateJobNode(job, client); CuratorTransactionFinal transactionFinal = SlaveUtils.updateJobNodeByTranstions(job, client, transaction); znodeApi.commitTransaction(transactionFinal); LoggerUtil.info("after update job is "+job.toString()); }catch(RuntimeException e){ LoggerUtil.error("update updateJob error, job is "+job,e); return ; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return ; } /** * 根据节点上job的列表字符串移除某jobname后返回job节点字符串 * @param jobName * @param targetJob * @return */ private static String removeJobName(String jobName,String targetJob){ String[] array = jobName.split(com.hqyg.disjob.common.Constants.TRANSFER_CHAR+Constants.JOB_SEPARATOR); List<String> list = Arrays.asList(array); ArrayList<String> tempList =new ArrayList<String>(list); tempList.remove(tempList.indexOf(targetJob)); StringBuffer sb = new StringBuffer(); for(int i = 0; i < tempList.size(); i++) { sb. append(tempList.get(i).trim()+Constants.JOB_SEPARATOR); } String newStr = sb.toString(); if(StringUtils.isNoneEmpty(newStr)){ return newStr.substring(0, newStr.length() - 1); } return ""; } //恢复 @Test public void resumeJob(){ ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); String jobNode = "/ejob/job"; List<String> groupList = znode.getChildren(client, jobNode); if(CollectionUtils.isNotEmpty(groupList)){ for(String groupName :groupList ){ String groupNode = jobNode + "/" + groupName; List<String> jobAll = znode.getChildren(client, groupNode) ; if(CollectionUtils.isNotEmpty(jobAll)){ for(String jobName:jobAll){ String job1Node = groupNode+"/"+jobName; String configNode = job1Node+ "/" + "config"; String json = znode.getData(client, configNode); Job zkJob = new Job(); if(StringUtils.isNotEmpty(json)){ zkJob = new Gson().fromJson(json, Job.class); jobOperationService.resumeJob(zkJob); } } } } } } //均分job到slave上 @Test public void averageDistributeSlaveJob() throws Exception{ jobOperationService.averageDistributeSlaveJob(); } @Test public void test() throws Exception{ ZnodeApiCuratorImpl nodeApi = new ZnodeApiCuratorImpl(); //nodeApi.deleteByRecursion(client, "/ejob/job/oms "); List<String> list = nodeApi.getChildren(client, "/ejob/job/oms "); for(String str:list){ System.out.println(str); } } //查看哪个group,job上没有分配ip @Test public void checkjobnovalue() throws Exception{ ZnodeApiCuratorImpl nodeApi = new ZnodeApiCuratorImpl(); ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); String jobNode = "/ejob/job"; int no =0; int noip=0; List<String> groupList = znode.getChildren(client, jobNode); if(CollectionUtils.isNotEmpty(groupList)){ for(String groupName :groupList ){ String groupNode = jobNode + "/" + groupName; List<String> jobAll = znode.getChildren(client, groupNode) ; if(CollectionUtils.isNotEmpty(jobAll)){ for(String jobName:jobAll){ String job1Node = groupNode+"/"+jobName; String configNode = job1Node+ "/" + "config"; String json = znode.getData(client, configNode); Job zkJob = new Job(); if(StringUtils.isNotEmpty(json)){ zkJob = new Gson().fromJson(json, Job.class); if(zkJob!=null){ no++; String slaveip = zkJob.getSlaveIp(); if(StringUtils.isEmpty(slaveip)){ System.out.println("groupName:"+groupName+",jobName:"+jobName+" no ip"); noip++; } } } /*int index = groupJob.hashCode() %slaveList.size(); EjobServerInfo info = slaveList.get(index); String ip = info.getIp();*/ } } } } System.out.println("has job number is "+no); System.out.println("no job ip number is "+noip); } public List<String> getJobsByIp(String ip){ ZnodeApiCuratorImpl znodeApi = new ZnodeApiCuratorImpl(); List<String> list = new ArrayList<String>(); int i=0; int j=0; CuratorFramework client = threadLocalClient.getCuratorClient().getCuratorClient(); String slavePath = ZKPaths.makePath(Constants.ROOT, Constants.EJOB_SERVER_NODE_ROOT, Constants.EJOB_SERVER_NODE_SLAVE); String slaveServerPath = ZKPaths.makePath(slavePath, Constants.PATH_SEPARATOR + ip); String slavePathExecution = ZKPaths.makePath(slaveServerPath, Constants.EJOB_SERVER_NODE_SLAVE_EXECUTION); List<String> groupLst = znodeApi.getChildren(client, slavePathExecution); for(String groupName : groupLst){ String slavePathJob = ZKPaths.makePath(slavePathExecution, Constants.PATH_SEPARATOR + groupName); String jobNameStr = znodeApi.getData(client, slavePathJob); String [] jobNameArray = jobNameStr.split(Constants.TRANSFER_CHAR + Constants.JOB_SEPARATOR); List<String> jobNameLst = new ArrayList<String>(); if(jobNameArray !=null && jobNameArray.length>0){ for(String jobName : jobNameArray){ jobNameLst.add(jobName); list.add(groupName+jobName); i++; } }else{ j++; System.out.println("group no data "+groupName); } //groupJobMap.put(groupName, jobNameLst); } System.out.println("job num is "+i+",j is "+j); return list; //return groupJobMap; } public List<String> checkjobnovalue1() throws Exception{ ZnodeApiCuratorImpl nodeApi = new ZnodeApiCuratorImpl(); ZnodeApiCuratorImpl znode = new ZnodeApiCuratorImpl(); String jobNode = "/ejob/job"; List<String> list = new ArrayList<String>(); int no =0; int noip=0; List<String> groupList = znode.getChildren(client, jobNode); if(CollectionUtils.isNotEmpty(groupList)){ for(String groupName :groupList ){ String groupNode = jobNode + "/" + groupName; List<String> jobAll = znode.getChildren(client, groupNode) ; if(CollectionUtils.isNotEmpty(jobAll)){ for(String jobName:jobAll){ String job1Node = groupNode+"/"+jobName; String configNode = job1Node+ "/" + "config"; String json = znode.getData(client, configNode); Job zkJob = new Job(); if(StringUtils.isNotEmpty(json)){ zkJob = new Gson().fromJson(json, Job.class); if(zkJob!=null){ list.add(groupName+jobName); no++; String slaveip = zkJob.getSlaveIp(); if(StringUtils.isEmpty(slaveip)){ System.out.println("groupName:"+groupName+",jobName:"+jobName+" no ip"); noip++; } } } /*int index = groupJob.hashCode() %slaveList.size(); EjobServerInfo info = slaveList.get(index); String ip = info.getIp();*/ } } } } System.out.println("has job number is "+no); System.out.println("no job ip number is "+noip); return list; } //查看哪个group,job没有被分配到slave上 @Test public void testwhicth() throws Exception{ String str[]={"10.40.6.100","10.40.6.183","10.40.6.184","10.40.6.185","192.168.56.1"}; List<String> list= new ArrayList<String>(); for(String ip:str){ list.addAll(getJobsByIp(ip)); } System.out.println("yifenpei"+list.size()); List<String> all= new ArrayList<String>(); all = checkjobnovalue1(); System.out.println("all is "+all.size()); all.removeAll(list); System.out.println("size is "+all.size()); for(String str1:all){ System.out.println("no dis is "+str1); } } //查看具体slave上job情况 @Test public void getJobsByIp(){ String ip ="192.168.56.1"; ZnodeApiCuratorImpl znodeApi = new ZnodeApiCuratorImpl(); int i=0; int j=0; CuratorFramework client = threadLocalClient.getCuratorClient().getCuratorClient(); String slavePath = ZKPaths.makePath(Constants.ROOT, Constants.EJOB_SERVER_NODE_ROOT, Constants.EJOB_SERVER_NODE_SLAVE); String slaveServerPath = ZKPaths.makePath(slavePath, Constants.PATH_SEPARATOR + ip); String slavePathExecution = ZKPaths.makePath(slaveServerPath, Constants.EJOB_SERVER_NODE_SLAVE_EXECUTION); List<String> groupLst = znodeApi.getChildren(client, slavePathExecution); for(String groupName : groupLst){ String slavePathJob = ZKPaths.makePath(slavePathExecution, Constants.PATH_SEPARATOR + groupName); String jobNameStr = znodeApi.getData(client, slavePathJob); String [] jobNameArray = jobNameStr.split(Constants.TRANSFER_CHAR + Constants.JOB_SEPARATOR); List<String> jobNameLst = new ArrayList<String>(); if(jobNameArray !=null && jobNameArray.length>0){ for(String jobName : jobNameArray){ jobNameLst.add(jobName); i++; } }else{ j++; System.out.println("group no data "+groupName); } //groupJobMap.put(groupName, jobNameLst); } System.out.println("job num is "+i+",j is "+j); //return groupJobMap; } }