private static JMXNodeTool createConnection()

in priam/src/main/java/com/netflix/priam/connection/JMXNodeTool.java [188:255]


    private static JMXNodeTool createConnection(final IConfiguration config)
            throws JMXConnectionException {
        // If Cassandra is started then only start the monitoring
        if (!CassandraMonitor.hasCassadraStarted()) {
            String exceptionMsg =
                    "Cannot perform connection to remove jmx agent as Cassandra has not yet started, check back again later";
            logger.debug(exceptionMsg);
            throw new JMXConnectionException(exceptionMsg);
        }

        if (tool
                != null) { // lets make sure we properly close any existing (even if it's corrupted)
            // connection to the remote jmx agent
            try {
                tool.close();
            } catch (IOException e) {
                logger.warn(
                        "Exception performing house cleaning -- closing current connection to jmx remote agent.  Msg: {}",
                        e.getLocalizedMessage(),
                        e);
            }
        }

        try {

            tool =
                    new BoundedExponentialRetryCallable<JMXNodeTool>() {
                        @Override
                        public JMXNodeTool retriableCall() throws Exception {
                            JMXNodeTool nodetool;
                            if ((config.getJmxUsername() == null
                                            || config.getJmxUsername().isEmpty())
                                    && (config.getJmxPassword() == null
                                            || config.getJmxPassword().isEmpty())) {
                                nodetool = new JMXNodeTool("localhost", config.getJmxPort());
                            } else {
                                nodetool =
                                        new JMXNodeTool(
                                                "localhost",
                                                config.getJmxPort(),
                                                config.getJmxUsername(),
                                                config.getJmxPassword());
                            }

                            Field fields[] = NodeProbe.class.getDeclaredFields();
                            for (Field field : fields) {
                                if (!field.getName().equals("mbeanServerConn")) continue;
                                field.setAccessible(true);
                                nodetool.mbeanServerConn =
                                        (MBeanServerConnection) field.get(nodetool);
                            }

                            return nodetool;
                        }
                    }.call();

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new JMXConnectionException(e.getMessage());
        }

        logger.info("Connected to remote jmx agent, will notify interested parties!");
        for (INodeToolObserver observer : observers) {
            observer.nodeToolHasChanged(tool);
        }

        return tool;
    }