package com.plexobject.rbac.jmx;
import java.io.Closeable;
import javax.management.JMRuntimeException;
import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;
import com.plexobject.rbac.Configuration;
public class JMXRemoteConnector implements Closeable {
private static final Logger LOGGER = Logger.getLogger(JMXRegistrar.class);
private final String url;
private JMXConnector connector;
private MBeanServerConnection serverConnection;
private static JMXRemoteConnector INSTANCE = new JMXRemoteConnector();
public static JMXRemoteConnector getInstance() {
return INSTANCE;
}
public <T> T getProxy(final String service, final Class<T> clazz) {
try {
final ObjectName mxbeanName = new ObjectName(service);
return JMX.newMXBeanProxy(serverConnection, mxbeanName, clazz);
} catch (Exception e) {
throw new JMRuntimeException("Failed to get proxy for " + service
+ " due to " + e);
}
}
synchronized void connect() {
if (isConnected()) {
return;
}
try {
JMXServiceURL serviceUrl = new JMXServiceURL(url);
connector = JMXConnectorFactory.connect(serviceUrl);
serverConnection = connector.getMBeanServerConnection();
} catch (Exception e) {
throw new JMRuntimeException("Failed to connect to " + url
+ " due to " + e);
}
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Connected to remote JMX server " + url);
}
}
@Override
public synchronized void close() {
if (!isConnected()) {
return;
}
try {
connector.close();
} catch (Exception e) {
}
connector = null;
serverConnection = null;
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Closed remote connection to JMX server " + url);
}
}
synchronized boolean isConnected() {
return connector != null;
}
/**
* @see java.lang.Object#equals(Object)
*/
@Override
public boolean equals(Object object) {
if (!(object instanceof JMXRemoteConnector)) {
return false;
}
JMXRemoteConnector rhs = (JMXRemoteConnector) object;
return new EqualsBuilder().append(this.url, rhs.url).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return new HashCodeBuilder(786529047, 1924536713).append(url)
.toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return new ToStringBuilder(this).append("url", this.url).toString();
}
JMXRemoteConnector() {
this(Configuration.getInstance().getProperty("weseed.jmx.rmi.host",
"localhost"), Configuration.getInstance().getInteger(
"weseed.jmx.rmi.port", 1099));
}
JMXRemoteConnector(final String host, final int port) {
this.url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port
+ "/jmxrmi";
}
}