/**
* Project: doris.admin.service.failover-0.1.0-SNAPSHOT
*
* File Created at 2011-5-27
* $Id$
*
* Copyright 1999-2100 Alibaba.com Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Alibaba Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Alibaba.com.
*/
package com.alibaba.doris.admin.service.failover.node.check;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
*
* @deprecated
* @author mian.hem
*/
public class NodeCheckService {
private static final Log log = LogFactory.getLog(NodeCheckService.class);
/**
* 默认线程池大小
*/
public static final int DEFAULT_POOL_SIZE = 5;
/**
* 默认一个任务的超时时间,单位为毫秒
*/
public static final long DEFAULT_TASK_TIMEOUT = 5000;
private int poolSize = DEFAULT_POOL_SIZE;
private ExecutorService executorService;
public NodeCheckService() {
setPoolSize(DEFAULT_POOL_SIZE);
}
public NodeCheckService(int poolSize) {
setPoolSize(poolSize);
}
/**
* 在线程池中执行所有给定的任务并取回运行结果,使用默认超时时间
*
* @see #invokeAll(List, long)
*/
public List<NodeCheckResult> invokeAll(List<NodeCheckTask> tasks) {
return invokeAll(tasks, DEFAULT_TASK_TIMEOUT * tasks.size());
}
/**
* 在线程池中执行所有给定的任务并取回运行结果
*
* @param timeout 以毫秒为单位的超时时间,小于0表示不设定超时
* @see java.util.concurrent.ExecutorService#invokeAll(java.util.Collection)
*/
public List<NodeCheckResult> invokeAll(List<? extends NodeCheckTask> tasks, long timeout) {
List<NodeCheckResult> nodes = new ArrayList<NodeCheckResult>(tasks.size());
try {
List<Future<NodeCheckResult>> futures = null;
if (timeout < 0) {
futures = executorService.invokeAll(tasks, DEFAULT_TASK_TIMEOUT * tasks.size(), TimeUnit.MILLISECONDS);
} else {
futures = executorService.invokeAll(tasks, timeout, TimeUnit.MILLISECONDS);
}
for (Future<NodeCheckResult> future : futures) {
try {
nodes.add(future.get());
} catch (ExecutionException e) {
log.error("failed to check node, skip and continue.", e);
}
}
} catch (InterruptedException e) {
log.error("failed to check node, skip and continue.", e);
}
return nodes;
}
/**
* 关闭当前ExecutorService
*
* @param timeout 以毫秒为单位的超时时间
*/
private void destoryExecutorService(long timeout) {
if (executorService != null && !executorService.isShutdown()) {
try {
executorService.awaitTermination(timeout, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();
}
}
/**
* 关闭当前ExecutorService,随后根据poolSize创建新的ExecutorService
*/
private void createExecutorService() {
destoryExecutorService(1000);
executorService = Executors.newFixedThreadPool(poolSize);
}
/**
* 调整线程池大小
*
* @see #createExecutorService()
*/
private void setPoolSize(int poolSize) {
this.poolSize = poolSize;
createExecutorService();
}
}