package com.vip.saturn.it.impl; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; 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.ConfigurationNode; import com.vip.saturn.job.internal.config.JobConfiguration; import com.vip.saturn.job.internal.execution.ExecutionNode; import com.vip.saturn.job.internal.server.ServerNode; import com.vip.saturn.job.internal.storage.JobNodePath; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class DeleteJobIT extends AbstractSaturnIT { @BeforeClass public static void setUp() throws Exception { startNamespaceShardingManagerList(1); startExecutorList(3); } @AfterClass public static void tearDown() throws Exception { stopExecutorList(); stopNamespaceShardingManagerList(); } /** * 全部结点存活时删除 * @throws InterruptedException */ @Test public void test_A() throws InterruptedException{ int shardCount = 3; final String jobName = "deleteITJob"; for(int i=0;i<shardCount;i++){ String key = jobName+"_"+i; SimpleJavaJob.statusMap.put(key, 0); } JobConfiguration jobConfiguration = new JobConfiguration(jobName); jobConfiguration.setCron("0/2 * * * * ?"); jobConfiguration.setJobType(JobType.JAVA_JOB.toString()); jobConfiguration.setJobClass(SimpleJavaJob.class.getCanonicalName()); jobConfiguration.setShardingTotalCount(shardCount); jobConfiguration.setShardingItemParameters("0=0,1=1,2=2"); addJob(jobConfiguration); Thread.sleep(1000); enableJob(jobConfiguration.getJobName()); Thread.sleep(4 * 1000); disableJob(jobConfiguration.getJobName()); Thread.sleep(1000); for(int i=0;i<shardCount;i++){ String key = jobName+"_"+i; assertThat(SimpleJavaJob.statusMap.get(key)).isGreaterThanOrEqualTo(1); } removeJob(jobConfiguration.getJobName()); Thread.sleep(5000); try { waitForFinish(new FinishCheck(){ @Override public boolean docheck() { if(regCenter.isExisted(JobNodePath.getJobNameFullPath(jobName))){ return false; } return true; } },30); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } /** * 部分结点存活 * @throws Exception */ @Test public void test_B() throws Exception{ final int shardCount = 3; final String jobName = "deleteITJob"; for(int i=0;i<shardCount;i++){ String key = jobName+"_"+i; SimpleJavaJob.statusMap.put(key, 0); } stopExecutor(0); stopExecutor(1); JobConfiguration jobConfiguration = new JobConfiguration(jobName); jobConfiguration.setCron("0/2 * * * * ?"); jobConfiguration.setJobType(JobType.JAVA_JOB.toString()); jobConfiguration.setJobClass(SimpleJavaJob.class.getCanonicalName()); jobConfiguration.setShardingTotalCount(shardCount); jobConfiguration.setShardingItemParameters("0=0,1=1,2=2"); addJob(jobConfiguration); Thread.sleep(1000); enableJob(jobConfiguration.getJobName()); try { waitForFinish(new FinishCheck(){ @Override public boolean docheck() { for(int i=0;i<shardCount;i++){ String key = jobName+"_"+i; if(SimpleJavaJob.statusMap.get(key) < 1){ return false; } } return true; } }, 4); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } disableJob(jobConfiguration.getJobName()); try { waitForFinish(new FinishCheck(){ @Override public boolean docheck() { for(int j=0;j<shardCount;j++){ if(!regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getCompletedNode(j)))){ return false; } } return true; } },3); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } removeJob(jobConfiguration.getJobName()); try { waitForFinish(new FinishCheck(){ @Override public boolean docheck() { for(Main executor:saturnExecutorList){ if(executor == null){ continue; } if(regCenter.isExisted(ServerNode.getServerNode(jobName, executor.getExecutorName()))){ return false; } } return true; } },10); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } /** * 补充删除作业时在启动Executor前有toDelete结点的IT: * 如果有在启动Executor前作业有配置toDelete结点则会判断并删除$Jobs/jobName/servers/executorName * * @throws Exception */ @Test public void test_C() throws Exception{ final int shardCount = 3; final String jobName = "deleteITJob"; for(int i=0;i<shardCount;i++){ String key = jobName+"_"+i; SimpleJavaJob.statusMap.put(key, 0); } stopExecutorList(); Thread.sleep(1000); configJob(jobName, ConfigurationNode.TO_DELETE, 1); JobConfiguration jobConfiguration = new JobConfiguration(jobName); jobConfiguration.setCron("0/2 * * * * ?"); jobConfiguration.setJobType(JobType.JAVA_JOB.toString()); jobConfiguration.setJobClass(SimpleJavaJob.class.getCanonicalName()); jobConfiguration.setShardingTotalCount(shardCount); jobConfiguration.setShardingItemParameters("0=0,1=1,2=2"); addJob(jobConfiguration); Thread.sleep(1000); final String serverNodePath = JobNodePath.getServerNodePath(jobName,"executorName0"); regCenter.persist(serverNodePath, ""); startExecutorList(1); Thread.sleep(1000); try { waitForFinish(new FinishCheck(){ @Override public boolean docheck() { if(regCenter.isExisted(serverNodePath)){ return false; } return true; } },10); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } }