在做云计算xenserverAPI 连接xenserver和关闭xenserver时候,由于有定时任务每分钟刷新一次,定时任务中存取数据时候会经常的连接和关闭xenserver,造成xenserver的连接阻塞,所以把连接放入队列中进行连接和断开…………
public class XenPool { private static Logger logger = Logger.getLogger(XenPool.class); private static final int XENSERVER_POOL_CAPACITY=20; private static Map<String,Queue<Connection>> pool = new ConcurrentHashMap(100); public XenPool(){} public synchronized static Connection getConnect(XenServer xenServer) { URL url =null; try { url = new URL(xenServer.Hostname); } catch (MalformedURLException e) { e.printStackTrace(); return null; } String host=url.getHost(); Queue queue = pool.get(host); Connection connection = null; if (queue != null) { Object conn = queue.poll(); if (conn != null) { connection = (Connection) conn; } } if (connection==null){ try { connection = new Connection(new URL(xenServer.Hostname), XenServer.REPLY_WAIT, XenServer.CONNECT_WAIT); } catch (MalformedURLException e) { logger.error("xenserver[" + xenServer.Hostname + "]建立连接异常!",e); } try { Session.loginWithPassword(connection, xenServer.Username, SystemService.decryptPassword(xenServer.Password), APIVersion.latest().toString()); } catch (Types.XenAPIException e) { logger.error("xenserver[" + xenServer.Hostname + "]XenAPIException异常!",e); } catch (XmlRpcException e) { logger.error("xenserver[" + xenServer.Hostname + "]XmlRpcException异常!",e); } } return connection; } public static void disconnect (Connection connection) { String host= null; try { host = connection.getConfig().getServerURL().getHost(); } catch (Exception e) { e.printStackTrace(); return; } Queue queue = pool.get(host); if (queue==null){ queue = new ArrayBlockingQueue(XENSERVER_POOL_CAPACITY); pool.put(host, queue); } boolean flag=queue.offer(connection); if (!flag){//当连接不用时放到队列里 try { Session.logout(connection); } catch (Types.XenAPIException e) { logger.error("xenserver[" + host + "]释放异常!",e); } catch (XmlRpcException e) { logger.error("xenserver[" + host + "]释放异常!",e); } } } }