package com.griddynamics.jagger.agent.impl; import com.google.common.collect.Maps; import com.griddynamics.jagger.util.AgentUtils; import com.griddynamics.jagger.util.Timeout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Required; import javax.management.MBeanServerConnection; import java.io.IOException; import java.util.Map; public class JmxConnector { private final static Logger log = LoggerFactory.getLogger(JmxConnector.class); private Timeout connectionTimeout = new Timeout(1000,""); private long connectionPeriod; private String jmxServices; private String urlFormat; public Timeout getConnectionTimeout() { return connectionTimeout; } @Required public void setConnectionTimeout(Timeout connectionTimeout) { this.connectionTimeout = connectionTimeout; } public long getConnectionPeriod() { return connectionPeriod; } @Required public void setConnectionPeriod(long connectionPeriod) { this.connectionPeriod = connectionPeriod; } public String getJmxServices() { return jmxServices; } @Required public void setJmxServices(String jmxServices) { this.jmxServices = jmxServices; } public String getUrlFormat() { return urlFormat; } @Required public void setUrlFormat(String urlFormat) { this.urlFormat = urlFormat; } public Map<String, MBeanServerConnection> connect(String name) { Exception exception = null; Map<String, MBeanServerConnection> connections = Maps.newHashMap(); long startTime = System.currentTimeMillis(); long lifeTime = 0; while (lifeTime < connectionTimeout.getValue()) { try { exception = null; log.info("Initializing JMX connection for {}. Url(s): {}",name,jmxServices); connections = AgentUtils.getMBeanConnections( AgentUtils.getJMXConnectors(AgentUtils.splitServices(jmxServices), name + " collect from jmx port ", urlFormat) ); if (connections.size() > 0) { break; } } catch (IOException e) { exception = e; } try { log.info("Wait for next try to initialize JMX connection for {} ms", connectionPeriod); Thread.sleep(connectionPeriod); } catch (InterruptedException e) { exception = e; log.warn("JMX initialization interrupted"); } lifeTime = System.currentTimeMillis() - startTime; } if (connections.size() == 0) { log.error("Timeout. JMX connection was not established in {} ms. Timeout setup {}", lifeTime,connectionTimeout.toString()); if (exception != null) { log.error("Error during JMX initializing",exception); } throw new RuntimeException("Error during JMX initialization. ZERO connections created for url " + jmxServices + "."); } return connections; } }