package com.vip.saturn.it; import static junit.framework.TestCase.fail; import static org.assertj.core.api.Assertions.assertThat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.curator.framework.CuratorFramework; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.vip.saturn.it.utils.NestedZkUtils; import com.vip.saturn.job.executor.Main; import com.vip.saturn.job.executor.SaturnExecutor; 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.failover.FailoverNode; import com.vip.saturn.job.internal.server.ServerNode; import com.vip.saturn.job.internal.sharding.ShardingNode; import com.vip.saturn.job.internal.sharding.ShardingService; import com.vip.saturn.job.internal.storage.JobNodePath; import com.vip.saturn.job.internal.storage.JobNodeStorage; import com.vip.saturn.job.reg.base.CoordinatorRegistryCenter; import com.vip.saturn.job.reg.zookeeper.ZookeeperConfiguration; import com.vip.saturn.job.reg.zookeeper.ZookeeperRegistryCenter; import com.vip.saturn.job.sharding.NamespaceShardingManager; import com.vip.saturn.job.utils.ScriptPidUtils; import com.vip.saturn.job.utils.SystemEnvProperties; /** * Basic for Saturn test automation */ public class SaturnAutoBasic { protected final static int timeout = 15; protected static final String NAMESPACE = "it-saturn-java.vip.vip.com"; protected static Logger log; protected static ZookeeperRegistryCenter regCenter; protected static NestedZkUtils nestedZkUtils; protected static List<Main> saturnExecutorList = new ArrayList<>(); protected static List<NamespaceShardingManager> namespaceShardingManagerList = new ArrayList<>(); protected static Map<String, ClassLoader> classloaders = new HashMap<String, ClassLoader>(); protected static void initSysEnv() { System.setProperty("namespace", NAMESPACE); System.setProperty("saturn.stdout", "true"); // logback都加载完了,下面这句无效; // System.setProperty("saturn.stdout", "true"); // 必须在设置saturn.out后,才加载日志框架 log = LoggerFactory.getLogger(AbstractSaturnIT.class); } protected static void initZK() throws Exception { nestedZkUtils = new NestedZkUtils(); nestedZkUtils.startServer(); assertThat(nestedZkUtils.isStarted()); String zkString = nestedZkUtils.getZkString(); SystemEnvProperties.VIP_SATURN_ZK_CONNECTION = nestedZkUtils.getZkString(); regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration(zkString, NAMESPACE, 1000, 3000, 3)); regCenter.init(); } public static URL[] getAppClassLoaderUrls(ClassLoader jobClassLoader) { URLClassLoader appClassLoader = (URLClassLoader) jobClassLoader; return appClassLoader.getURLs(); } public static void startExecutorList(int count) throws Exception { assertThat(nestedZkUtils.isStarted()); for (int i = 0; i < count; i++) { startOneNewExecutorList(); } Thread.sleep(2000); } public static Main startOneNewExecutorList() throws Exception { assertThat(nestedZkUtils.isStarted()); int size = saturnExecutorList.size(); Main main = new Main(); String executorName = "executorName" + size; /* ClassLoader saturnClassloader = classloaders.get(executorName); if(saturnClassloader == null){ saturnClassloader = new SaturnClassLoader(getAppClassLoaderUrls(Main.class.getClassLoader()), null); classloaders.put(executorName,saturnClassloader); }*/ String[] args = {"-namespace", NAMESPACE, "-executorName", executorName}; main.launchInner(args, Main.class.getClassLoader(), Main.class.getClassLoader()); saturnExecutorList.add(main); Thread.sleep(1000); return main; } public static Main startExecutor(int index) throws Exception { assertThat(nestedZkUtils.isStarted()); Main saturnContainer = saturnExecutorList.get(index); if (saturnContainer != null) { //如果节点正在运行则退出 log.warn("the executor{} already exist.", index); return saturnContainer; } else { Main main = new Main(); String executorName = "executorName" + index; String[] args = {"-namespace", NAMESPACE, "-executorName", executorName}; main.launchInner(args, Main.class.getClassLoader(), Main.class.getClassLoader()); saturnExecutorList.set(index, main); Thread.sleep(1000); return main; } } public static void stopExecutor(int index) throws Exception { assertThat(saturnExecutorList.size()).isGreaterThan(index); Main saturnContainer = saturnExecutorList.get(index); if (saturnContainer != null) { saturnContainer.shutdown(); } else { log.warn("the {} SaturnContainer has stopped", index); } saturnExecutorList.set(index, null); for (Main tmp : saturnExecutorList) { if (tmp != null) { return; } } saturnExecutorList.clear(); } public static void stopExecutorList() throws Exception { for (int i = 0; i < saturnExecutorList.size(); i++) { Main saturnContainer = saturnExecutorList.get(i); if (saturnContainer != null) { saturnContainer.shutdown(); } } saturnExecutorList.clear(); } public static void startNamespaceShardingManagerList(int count) throws Exception { assertThat(nestedZkUtils.isStarted()); for (int i = 0; i < count; i++) { ZookeeperRegistryCenter shardingRegCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration(nestedZkUtils.getZkString(), NAMESPACE, 1000, 3000, 3)); shardingRegCenter.init(); NamespaceShardingManager namespaceShardingManager = new NamespaceShardingManager((CuratorFramework) shardingRegCenter.getRawClient(),NAMESPACE, "127.0.0.1-" + i, null); namespaceShardingManager.start(); namespaceShardingManagerList.add(namespaceShardingManager); } } public static void stopNamespaceShardingManager(int index) { assertThat(namespaceShardingManagerList.size()).isGreaterThan(index); NamespaceShardingManager namespaceShardingManager = namespaceShardingManagerList.get(index); if (namespaceShardingManager != null) { namespaceShardingManager.stop(); namespaceShardingManager.getCuratorFramework().close(); } else { log.warn("the {} NamespaceShardingManager has stopped", index); } namespaceShardingManagerList.set(index, null); } public static void stopNamespaceShardingManagerList() throws InterruptedException { // 等待做完一些事情 Thread.sleep(200); for (int i = 0; i < namespaceShardingManagerList.size(); i++) { NamespaceShardingManager namespaceShardingManager = namespaceShardingManagerList.get(i); if (namespaceShardingManager != null) { namespaceShardingManager.stop(); namespaceShardingManager.getCuratorFramework().close(); } // 等待选举完成 Thread.sleep(200); } namespaceShardingManagerList.clear(); } public static CoordinatorRegistryCenter getExecutorRegistryCenter(Main executorMain) { return ((SaturnExecutor)executorMain.getSaturnExecutor()).getSaturnExecutorService().getCoordinatorRegistryCenter(); } public static void stopZkServer() throws IOException { nestedZkUtils.stopServer(); } public static void killSession(CuratorFramework client) throws Exception { nestedZkUtils.killSession(client.getZookeeperClient().getZooKeeper()); } public static void enableJob(String jobName) { configJob(jobName, ConfigurationNode.ENABLED, true); } public static void disableJob(String jobName) { configJob(jobName, ConfigurationNode.ENABLED, false); } public static void removeJob(String jobName) { configJob(jobName, ConfigurationNode.TO_DELETE, 1); } public static void forceRemoveJob(String jobName) { try { regCenter.remove(JobNodePath.getJobNameFullPath(jobName)); } catch (Exception e) { } } public static void runAtOnce(String jobName) { for (int i = 0; i < saturnExecutorList.size(); i++) { Main saturnContainer = saturnExecutorList.get(i); if (saturnContainer == null) { continue; } String path = JobNodePath.getNodeFullPath(jobName, String.format(ServerNode.RUNONETIME, saturnContainer.getExecutorName())); if (regCenter.isExisted(path)) { regCenter.remove(path); } regCenter.persist(path, "1"); } } public static void forceStopJob(String jobName) { for (int i = 0; i < saturnExecutorList.size(); i++) { Main saturnContainer = saturnExecutorList.get(i); if (saturnContainer == null) { continue; } String path = JobNodePath.getNodeFullPath(jobName, String.format(ServerNode.STOPONETIME, saturnContainer.getExecutorName())); if (regCenter.isExisted(path)) { regCenter.remove(path); } regCenter.persist(path, "1"); } } protected static void configJob(String jobName, String configPath, Object value) { JobConfiguration jobConfiguration = new JobConfiguration(jobName); JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); jobNodeStorage.fillJobNodeIfNullOrOverwrite(configPath, value); } protected static void updateJobNode(JobConfiguration jobConfiguration, String node, String value) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); jobNodeStorage.updateJobNode(node, value); } protected static void updateJobConfig(JobConfiguration jobConfiguration, String configKey, Object configValue) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); jobNodeStorage.updateJobNode("config/" + configKey, configValue); } protected static String getJobNode(JobConfiguration jobConfiguration, String node) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); return jobNodeStorage.getJobNodeData(node); } protected static void removeJobNode(JobConfiguration jobConfiguration, String node) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); jobNodeStorage.removeJobNodeIfExisted(node); } protected static void doReport(JobConfiguration jobConfiguration) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); jobNodeStorage.fillJobNodeIfNullOrOverwrite("control/report", System.currentTimeMillis()); } protected static void addJob(JobConfiguration jobConfiguration) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.JOB_TYPE, jobConfiguration.getJobType()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.SHARDING_TOTAL_COUNT, jobConfiguration.getShardingTotalCount()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.SHARDING_ITEM_PARAMETERS, jobConfiguration.getShardingItemParameters()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.JOB_PARAMETER, jobConfiguration.getJobParameter()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.TIMEZONE, jobConfiguration.getTimeZone()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.CRON, jobConfiguration.getCron()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.PREFER_LIST, jobConfiguration.getPreferList()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.PAUSE_PERIOD_DATE, jobConfiguration.getPausePeriodDate()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.PAUSE_PERIOD_TIME, jobConfiguration.getPausePeriodTime()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.PROCESS_COUNT_INTERVAL_SECONDS, jobConfiguration.getProcessCountIntervalSeconds()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.FAILOVER, jobConfiguration.isFailover()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.LOAD_LEVEL, jobConfiguration.getLoadLevel()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.DESCRIPTION, jobConfiguration.getDescription()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.TIMEOUTSECONDS, jobConfiguration.getTimeoutSeconds()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.SHOW_NORMAL_LOG, jobConfiguration.isShowNormalLog()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.QUEUE_NAME, jobConfiguration.getQueueName()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.CHANNEL_NAME, jobConfiguration.getChannelName()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.USE_DISPREFER_LIST, jobConfiguration.isUseDispreferList()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.LOCAL_MODE, jobConfiguration.isLocalMode()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.USE_SERIAL, jobConfiguration.isUseSerial()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.ENABLED, jobConfiguration.isEnabled()); jobNodeStorage.fillJobNodeIfNullOrOverwrite(ConfigurationNode.JOB_CLASS, jobConfiguration.getJobClass()); } public static boolean isNeedSharding(JobConfiguration jobConfiguration) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); return jobNodeStorage.isJobNodeExisted(ShardingNode.NECESSARY) && !ShardingService.SHARDING_UN_NECESSARY.equals(jobNodeStorage.getJobNodeDataDirectly(ShardingNode.NECESSARY)); } public static boolean isOnline(String executorName) { String path = "/$SaturnExecutors/executors/" + executorName + "/ip"; return regCenter.isExisted(path); } public static boolean isFailoverAssigned(JobConfiguration jobConfiguration, Integer item) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); return jobNodeStorage.isJobNodeExisted(FailoverNode.getExecutionFailoverNode(item)); } public static boolean noFailoverItems(JobConfiguration jobConfiguration) { JobNodeStorage jobNodeStorage = new JobNodeStorage(regCenter, jobConfiguration); return jobNodeStorage.getJobNodeChildrenKeys(FailoverNode.getFailoverItemsNode()).isEmpty(); } public interface FinishCheck { boolean docheck(); } public static void waitForFinish(FinishCheck check, int timeOutInSeconds) throws Exception { int count = 0; while (true) { if (check.docheck()) { break; } // Thread.sleep(1000); Thread.sleep(500); //Poll value. Note that a lot checks are done with zkServer, increase this to avoid some side-effect count++; if (count > timeOutInSeconds * 2) { throw new Exception("time is up. check failed."); } } } public static void cleanJobs(String... jobNames) throws InterruptedException { for(String job: jobNames) { disableJob(job); Thread.sleep(1000); removeJob(job); Thread.sleep(1000); } } private static JobConfiguration initConfigOfShellMsgJob(String jobName, String queue, int shardCount, String shardingItemParameters) { JobConfiguration jobCfg = new JobConfiguration(jobName); jobCfg.setJobType(JobType.VSHELL.toString()); jobCfg.setQueueName(queue); jobCfg.setProcessCountIntervalSeconds(1); //for quickly get statistics jobCfg.setShardingTotalCount(shardCount); jobCfg.setShardingItemParameters(shardingItemParameters); return jobCfg; } private static JobConfiguration initConfigOfJavaMsgJob(String jobName, String queue, int shardCount, String shardingItemParameters) { JobConfiguration jobCfg = new JobConfiguration(jobName); jobCfg.setJobType(JobType.MSG_JOB.toString()); jobCfg.setQueueName(queue); jobCfg.setProcessCountIntervalSeconds(1); //for quickly get statistics jobCfg.setShardingTotalCount(shardCount); jobCfg.setShardingItemParameters(shardingItemParameters); return jobCfg; } private static JobConfiguration initConfigOfshellCronJob(String jobName, String cron, int shardCount, String shardingItemParameters) { JobConfiguration jobCfg = new JobConfiguration(jobName); jobCfg.setJobType(JobType.SHELL_JOB.toString()); jobCfg.setCron(cron); jobCfg.setProcessCountIntervalSeconds(1); //for quickly get statistics jobCfg.setShardingTotalCount(shardCount); jobCfg.setShardingItemParameters(shardingItemParameters); return jobCfg; } private static JobConfiguration initConfigOfjavaCronJob(String jobName, String cron, int shardCount, String shardingItemParameters) { JobConfiguration jobCfg = new JobConfiguration(jobName); jobCfg.setJobType(JobType.JAVA_JOB.toString()); jobCfg.setCron(cron); jobCfg.setProcessCountIntervalSeconds(1); //for quickly get statistics jobCfg.setShardingTotalCount(shardCount); jobCfg.setShardingItemParameters(shardingItemParameters); return jobCfg; } public static JobConfiguration addShellCronJob(String jobName, String cron, int shardCount, String shardingItemParameters) throws InterruptedException { JobConfiguration jobConfiguration = initConfigOfshellCronJob(jobName, cron, shardCount, shardingItemParameters); addJob(jobConfiguration); Thread.sleep(1000); return jobConfiguration; } public static JobConfiguration addShellCronJobWithChannel(String jobName, String cron, int shardCount, String shardingItemParameters, String channel) throws InterruptedException { JobConfiguration jobConfiguration = initConfigOfshellCronJob(jobName, cron, shardCount, shardingItemParameters); jobConfiguration.setChannelName(channel); addJob(jobConfiguration); Thread.sleep(1000); return jobConfiguration; } public static JobConfiguration addShellMsgJobWithQueue(String jobName, String queue, int shardCount, String shardingItemParameters) throws InterruptedException { JobConfiguration jobCfg = initConfigOfShellMsgJob(jobName, queue, shardCount, shardingItemParameters); addJob(jobCfg); Thread.sleep(1000); // updateJobNode(jobConfiguration, "config/cron", "0/1 * * * * ?"); return jobCfg; } public static JobConfiguration addShellMsgJobWithQueueAndChannel(String jobName, String queue, String channel, int shardCount, String shardingItemParameters) throws InterruptedException { JobConfiguration jobCfg = initConfigOfShellMsgJob(jobName, queue, shardCount, shardingItemParameters); jobCfg.setChannelName(channel); addJob(jobCfg); Thread.sleep(1000); return jobCfg; } public static void waitForExecutorHasSuccessCount(final JobConfiguration jobConfiguration, final Main executor) { try { waitForFinish(new FinishCheck() { @Override public boolean docheck() { String successCount = getSuccessCountOfExecutor(jobConfiguration, executor); //is null when begin return successCount != null && Integer.parseInt(successCount) >= 1; } }, timeout); } catch (Exception e) { e.printStackTrace(); } } private static void waitForOldShellJobPidNotRunning(final String jobName, final int shardCount) { try { waitForFinish(new FinishCheck(){ @Override public boolean docheck() { for(int i=0; i<saturnExecutorList.size(); i++) { Main saturnContainer = saturnExecutorList.get(i); for(int j=0;j<shardCount;j++){ long pid = ScriptPidUtils.getFirstPidFromFile(saturnContainer.getExecutorName(), jobName, "" + j); if(pid > 0 && ScriptPidUtils.isPidRunning(pid)){ return false; } } } return true; } },timeout); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public static boolean assertExecutorFailureCountIncreaseInSpanTime(final JobConfiguration jobConfiguration, final Main executor, int spanTime) { final String failureCountBefore = getFailureCountOfExecutor(jobConfiguration, executor); try { waitForFinish(new FinishCheck() { @Override public boolean docheck() { String failureCount = getFailureCountOfExecutor(jobConfiguration, executor); return !(failureCount == null || failureCount.equals(failureCountBefore)); } }, spanTime); } catch (Exception e) { e.printStackTrace(); } return false; } public static boolean assertExecutorFailureCountIncrease(JobConfiguration jobConfiguration, final Main executor, final String failureCountBefore) { String failureCount = getFailureCountOfExecutor(jobConfiguration, executor); return !(failureCount == null || Integer.parseInt(failureCount) > Integer.parseInt(failureCountBefore)); } public static void waitForExecutorProcessCountChanged(final JobConfiguration jobConfiguration, final Main executor) { final String successCountBefore = getSuccessCountOfExecutor(jobConfiguration, executor); final String failureCountBefore = getFailureCountOfExecutor(jobConfiguration, executor); try { waitForFinish(new FinishCheck() { @Override public boolean docheck() { String successCount = getSuccessCountOfExecutor(jobConfiguration, executor); String failureCount = getFailureCountOfExecutor(jobConfiguration, executor); if ((successCount == null) || (failureCount == null)) { return false; } else { return !(successCount.equals(successCountBefore) && failureCount.equals(failureCountBefore)); } //successCount.equals("0") || failureCount.equals("0") } }, timeout); } catch (Exception e) { e.printStackTrace(); } } /** * Too fast, not applicable */ private static void waitForJobHasRunningZnode(final String jobName, final int shardCount) { try { waitForFinish(new FinishCheck() { @Override public boolean docheck() { return hasRunningZnode(jobName, shardCount); } }, timeout); } catch (Exception e) { e.printStackTrace(); } } private static void waitForJobHasCompletedZnode(final String jobName, final int shardCount) { try { waitForFinish(new FinishCheck() { @Override public boolean docheck() { return hasCompletedZnode(jobName, shardCount); } }, timeout); } catch (Exception e) { e.printStackTrace(); } } /** * Wait until all shards having completed znode and wait some time */ public static void waitForJobFinish(final String jobName, final int shardCount) { try { waitForFinish(new FinishCheck() { @Override public boolean docheck() { return hasCompletedZnodeForAllShards(jobName, shardCount); } }, timeout); } catch (Exception e) { e.printStackTrace(); } finally { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static String getSuccessCountOfExecutor(JobConfiguration jobConfiguration, final Main executor) { return getJobNode(jobConfiguration, "servers/" + executor.getExecutorName() + "/processSuccessCount"); } public static String getFailureCountOfExecutor(JobConfiguration jobConfiguration, final Main executor) { return getJobNode(jobConfiguration, "servers/" + executor.getExecutorName() + "/processFailureCount"); } /** * return true if any shard has timeout znode */ private static boolean hasTimeoutZnode(String jobName, int shardCount) { for (int i = 0; i < shardCount; i++) { if (regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getTimeoutNode(i)))) { return true; } } return false; } /** * return true if any shard has "fail" znode */ private static boolean hasFailZnode(String jobName, int shardCount) { for (int i = 0; i < shardCount; i++) { if (regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getFailedNode(i)))) { return true; } } return false; } /** * return true if any shard has "completed" znode */ private static boolean hasCompletedZnode(String jobName, int shardCount) { for (int i = 0; i < shardCount; i++) { if (regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getCompletedNode(i)))) { return true; } } return false; } /** * return true if any shard has "completed" znode */ protected static boolean hasCompletedZnodeForAllShards(String jobName, int shardCount) { for (int i = 0; i < shardCount; i++) { if (!regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getCompletedNode(i)))) { return false; } } return true; } /** * return true if any shard has "running" znode */ private static boolean hasRunningZnode(String jobName, int shardCount) { for (int i = 0; i < shardCount; i++) { if (regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getRunningNode(i)))) { return true; } } return false; } public static boolean assertTimeoutZnodeExists(final String jobName, final int shardCount, int timeout) throws Exception { waitForFinish(new FinishCheck() { @Override public boolean docheck() { return hasTimeoutZnode(jobName, shardCount); } }, timeout); return false; } private static void waitForMsgTotalCountChanged(final String queueUrl, final String userName, final String password) throws Exception { final String msgTotalCountBefore = StringUtils.substringBetween(getRestData(queueUrl, userName, password), "messages\":", ",\"messages_details"); try { waitForFinish(new FinishCheck() { @Override public boolean docheck() { String msgTotalCountNow; try { msgTotalCountNow = StringUtils.substringBetween(getRestData(queueUrl, userName, password), "messages\":", ",\"messages_details"); return !msgTotalCountNow.equals(msgTotalCountBefore) ; } catch (IOException e) { log.error("Cannot get msgTotalCount!"); e.printStackTrace(); } return false; } }, timeout); } catch (Exception e) { e.printStackTrace(); } } public static String getRestData(String url, String userName, String password) throws IOException { return getRestData(url, userName, password,"GET"); } public static String getRestData(String url, String userName, String password, String method) throws IOException { URL getUrl = new URL(url); HttpURLConnection connection = null; BufferedReader reader = null; try { connection = (HttpURLConnection) getUrl.openConnection(); if (!StringUtils.isEmpty(userName) && !StringUtils.isEmpty(password)) { String authString = userName + ":" + password; connection.setRequestProperty("Authorization", "Basic " + SaturnBaseEncoder.getInstance().encodeToString(authString.getBytes())); } connection.setRequestMethod(method); connection.connect(); reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuffer buffer = new StringBuffer(); String temp; while ((temp = reader.readLine()) != null) { buffer.append(temp).append(System.lineSeparator()); } return buffer.toString(); } catch (Exception ex) { log.warn(getUrl + " in getData has error", ex.getMessage()); return ""; } finally { if (reader != null) { reader.close(); } if (connection != null) { connection.disconnect(); } } } }