package com.vip.saturn.it.impl; import com.vip.saturn.it.AbstractSaturnIT; import com.vip.saturn.it.JobType; import com.vip.saturn.it.job.SimpleJavaJob; import com.vip.saturn.job.executor.Main; import com.vip.saturn.job.internal.config.JobConfiguration; import com.vip.saturn.job.internal.sharding.ShardingNode; import com.vip.saturn.job.internal.storage.JobNodePath; import com.vip.saturn.job.sharding.entity.Executor; import com.vip.saturn.job.utils.ItemUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; import org.junit.Assert; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; /** * Created by Ivy01.li on 2016/9/12. */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class ShardingWithLoadIT extends AbstractSaturnIT{ @BeforeClass public static void setUp() throws Exception { startNamespaceShardingManagerList(1); } @AfterClass public static void tearDown() throws Exception { stopNamespaceShardingManagerList(); } //添加指定配置和分片的SimpleJavaJob public void addSimpleJavaJob(String jobName, int shardCount, JobConfiguration jobConfiguration){ for (int i = 0; i < shardCount; i++) { String key = jobName + "_" + i; SimpleJavaJob.statusMap.put(key, 0); } jobConfiguration.setShardingTotalCount(shardCount); addJob(jobConfiguration); } @Test public void A_JavaMultiJobWithLoad() throws Exception { String preferList = null; multiJobSharding(preferList); stopExecutorList(); } @Test //仅对作业3增加优先节点1,2 public void B_JavaMultiJobWithLoadWithPreferList() throws Exception { String preferList = "executorName" + "0," + "executorName" + 1; multiJobSharding(preferList); stopExecutorList(); } public void multiJobSharding(String preferListJob3) throws Exception { //作业1,负荷为1,分片数为2 String jobName1 = "JOB_1LOAD_2SHARDING"; final JobConfiguration jobConfiguration1 = new JobConfiguration(jobName1); jobConfiguration1.setCron("* * 1 * * ?"); jobConfiguration1.setJobType(JobType.JAVA_JOB.toString()); jobConfiguration1.setJobClass(SimpleJavaJob.class.getCanonicalName()); jobConfiguration1.setLoadLevel(1); jobConfiguration1.setShardingItemParameters("0=0,1=1,2=2"); addSimpleJavaJob(jobName1, 2, jobConfiguration1); //作业2,负荷为2,分片数为2 String jobName2 = "JOB_2LOAD_2SHARDING"; final JobConfiguration jobConfiguration2 = new JobConfiguration(jobName2); jobConfiguration2.setCron("* * 1 * * ?"); jobConfiguration2.setJobType(JobType.JAVA_JOB.toString()); jobConfiguration2.setJobClass(SimpleJavaJob.class.getCanonicalName()); jobConfiguration2.setLoadLevel(2); jobConfiguration2.setShardingItemParameters("0=0,1=1,2=2"); addSimpleJavaJob(jobName2, 2, jobConfiguration2); //作业3,负荷为1,分片数为3 String jobName3 = "JOB_1LOAD_3SHARDING"; final JobConfiguration jobConfiguration3 = new JobConfiguration(jobName3); jobConfiguration3.setCron("* * 1 * * ?"); jobConfiguration3.setJobType(JobType.JAVA_JOB.toString()); jobConfiguration3.setJobClass(SimpleJavaJob.class.getCanonicalName()); jobConfiguration3.setLoadLevel(1); jobConfiguration3.setShardingItemParameters("0=0,1=1,2=2"); //没有preferlist or 设置preferlist1,2 if (null != preferListJob3) { jobConfiguration3.setPreferList(preferListJob3); } addSimpleJavaJob(jobName3, 3, jobConfiguration3); Thread.sleep(1 * 1000); //启用作业1,2,3 enableJob(jobName1); enableJob(jobName2); enableJob(jobName3); Thread.sleep(1 * 1000); Main executor1 = startOneNewExecutorList();// 启动第1台executor runAtOnce(jobName1); runAtOnce(jobName2); runAtOnce(jobName3); Thread.sleep(1000); waitForFinish(new AbstractSaturnIT.FinishCheck(){ @Override public boolean docheck() { if(isNeedSharding(jobConfiguration1) || isNeedSharding(jobConfiguration2) || isNeedSharding(jobConfiguration3)){ return false; } return true; } },30); List<Integer> itemsJob1Exe1 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName1, ShardingNode.getShardingNode(executor1.getExecutorName())))); assertThat(itemsJob1Exe1).contains(0, 1); List<Integer> itemsJob2Exe1 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName2, ShardingNode.getShardingNode(executor1.getExecutorName())))); assertThat(itemsJob2Exe1).contains(0, 1); List<Integer> itemsJob3Exe1 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName3, ShardingNode.getShardingNode(executor1.getExecutorName())))); assertThat(itemsJob3Exe1).contains(0, 1, 2); Main executor2 = startOneNewExecutorList();// 启动第2台executor Thread.sleep(1000); runAtOnce(jobName1); runAtOnce(jobName2); runAtOnce(jobName3); Thread.sleep(1000); waitForFinish(new AbstractSaturnIT.FinishCheck(){ @Override public boolean docheck() { if(isNeedSharding(jobConfiguration1) || isNeedSharding(jobConfiguration2) || isNeedSharding(jobConfiguration3)){ return false; } return true; } },60); //大负荷作业Job2分片都到节点2 List<Integer> itemsJob2Exe2 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName2, ShardingNode.getShardingNode(executor2.getExecutorName())))); System.out.println("job2 at exe2 :" + itemsJob2Exe2); assertThat(itemsJob2Exe2).contains(0, 1); Main executor3 = startOneNewExecutorList();// 启动第3台executor Thread.sleep(1000); runAtOnce(jobName1); runAtOnce(jobName2); runAtOnce(jobName3); Thread.sleep(1000); List<Integer> itemsJob1Exe3 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName1, ShardingNode.getShardingNode(executor3.getExecutorName())))); List<Integer> itemsJob2Exe3 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName2, ShardingNode.getShardingNode(executor3.getExecutorName())))); List<Integer> itemsJob3Exe3 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName3, ShardingNode.getShardingNode(executor3.getExecutorName())))); System.out.println("itemsJob1Exe3 : " + itemsJob1Exe3); System.out.println("itemsJob2Exe3 : " + itemsJob2Exe3); System.out.println("itemsJob3Exe3 : " + itemsJob3Exe3); //节点3应该有分片 Assert.assertFalse("The exe3 has no sharding. ", itemsJob1Exe3.isEmpty() && itemsJob2Exe3.isEmpty() && itemsJob3Exe3.isEmpty()); //当job3设置优先节点的情况下 if (null != preferListJob3){ //节点3不应该有job3的分片 Assert.assertTrue("The exe3 should have no sharding of job3. ", itemsJob3Exe3.isEmpty()); } //停节点1前先获取节点1上所有作业分片 itemsJob1Exe1 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName1, ShardingNode.getShardingNode(executor1.getExecutorName())))); itemsJob2Exe1 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName2, ShardingNode.getShardingNode(executor1.getExecutorName())))); itemsJob3Exe1 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName3, ShardingNode.getShardingNode(executor1.getExecutorName())))); stopExecutor(0); //停第1个executor Thread.sleep(1000); runAtOnce(jobName1); runAtOnce(jobName2); runAtOnce(jobName3); Thread.sleep(1000); waitForFinish(new AbstractSaturnIT.FinishCheck(){ @Override public boolean docheck() { if(isNeedSharding(jobConfiguration1) || isNeedSharding(jobConfiguration2) || isNeedSharding(jobConfiguration3)){ return false; } return true; } },10); if(!itemsJob1Exe1.isEmpty()){ List<Integer> itemsJob1Exe2 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName1, ShardingNode.getShardingNode(executor2.getExecutorName())))); itemsJob1Exe3 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName1, ShardingNode.getShardingNode(executor3.getExecutorName())))); for (Integer i:itemsJob1Exe1) { Assert.assertTrue("the sharding of exe1 should be shift to exe2 or exe3" , itemsJob1Exe2.contains(i) || itemsJob1Exe3.contains(i)); } } if(!itemsJob2Exe1.isEmpty()){ itemsJob2Exe2 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName2, ShardingNode.getShardingNode(executor2.getExecutorName())))); itemsJob2Exe3 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName2, ShardingNode.getShardingNode(executor3.getExecutorName())))); for (Integer i:itemsJob2Exe1) { Assert.assertTrue("the sharding of exe1 should be shift to exe2 or exe3" , itemsJob2Exe2.contains(i) || itemsJob2Exe3.contains(i)); } } if(!itemsJob3Exe1.isEmpty()){ List<Integer> itemsJob3Exe2 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName3, ShardingNode.getShardingNode(executor2.getExecutorName())))); itemsJob3Exe3 = ItemUtils.toItemList( regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName3, ShardingNode.getShardingNode(executor3.getExecutorName())))); for (Integer i:itemsJob3Exe1) { Assert.assertTrue("the sharding of exe1 should be shift to exe2 or exe3" , itemsJob3Exe2.contains(i) || itemsJob3Exe3.contains(i)); } } disableJob(jobName1); disableJob(jobName2); disableJob(jobName3); removeJob(jobName1); removeJob(jobName2); removeJob(jobName3); stopExecutorList(); Thread.sleep(2000); forceRemoveJob(jobName1); forceRemoveJob(jobName2); forceRemoveJob(jobName3); } }