From 263e7cc1a0a15d512eef6f2d69464cc7e123e6c8 Mon Sep 17 00:00:00 2001 From: Robert Gemmell Date: Thu, 3 Dec 2009 23:06:36 +0000 Subject: QPID-2152: Update the timeout process so as not to return a null, and close any orphaned connections. Increase default timeout to 15sec. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@886974 13f79535-47bb-0310-9956-ffa450edef68 --- .../management/common/JMXConnnectionFactory.java | 79 +++++++++++++--------- 1 file changed, 46 insertions(+), 33 deletions(-) (limited to 'qpid/java/management/common/src') diff --git a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/JMXConnnectionFactory.java b/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/JMXConnnectionFactory.java index f5831c9e28..c03b782987 100644 --- a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/JMXConnnectionFactory.java +++ b/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/JMXConnnectionFactory.java @@ -199,25 +199,32 @@ public class JMXConnnectionFactory { Thread connectorThread = new Thread(connector); connectorThread.start(); connectorThread.join(timeout); - - if (connector.getConnectionException() != null) + + if(connector.getJmxc() == null) { - throw connector.getConnectionException(); + if (connector.getConnectionException() != null) + { + throw connector.getConnectionException(); + } + else + { + throw new IOException("Timed out connecting to " + host + ":" + port); + } } + return connector.getJmxc(); } - public static class ConnectWaiter implements Runnable + private static class ConnectWaiter implements Runnable { - private boolean _connected; private Exception _connectionException; private JMXConnector _jmxc; private JMXServiceURL _jmxUrl; private Map _env; + private boolean _connectionRetrieved; public ConnectWaiter(JMXServiceURL url, Map env) { - super(); _jmxUrl = url; _env = env; } @@ -226,46 +233,52 @@ public class JMXConnnectionFactory { { try { - setConnected(false); - setConnectionException(null); - setJmxc(JMXConnectorFactory.connect(_jmxUrl, _env)); - - setConnected(true); + _jmxc = null; + _connectionRetrieved = false; + _connectionException = null; + + JMXConnector conn = JMXConnectorFactory.connect(_jmxUrl, _env); + + synchronized (this) + { + if(_connectionRetrieved) + { + //The app thread already timed out the attempt and retrieved the + //null connection, so just close this orphaned connection + try + { + conn.close(); + } + catch (IOException e) + { + //ignore + } + } + else + { + _jmxc = conn; + } + } } catch (Exception ex) { - setConnectionException(ex); + _connectionException = ex; } } - public void setConnected(boolean _connected) - { - this._connected = _connected; - } - - public boolean getConnected() - { - return _connected; - } - - public void setConnectionException(Exception _connectionException) - { - this._connectionException = _connectionException; - } - public Exception getConnectionException() { return _connectionException; } - public void setJmxc(JMXConnector _jmxc) - { - this._jmxc = _jmxc; - } - public JMXConnector getJmxc() { - return _jmxc; + synchronized (this) + { + _connectionRetrieved = true; + + return _jmxc; + } } } } -- cgit v1.2.1