blob: 42373c946a649d9c0ecf650319ffc9bdc032d5f3 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.vmware.gemfire.tools.pulse.tests;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Set;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class Server {
private static final String DEFAULT_HOST = "127.0.0.1"; //"localhost"
private static final int DEFAULT_PORT = 9999;
private final MBeanServer mbs;
private final JMXServiceURL url;
private final JMXConnectorServer cs;
private String propFile = null;
public Server(int port, String properties) throws IOException {
try {
java.rmi.registry.LocateRegistry.createRegistry(port);
System.out.println("RMI registry ready.");
} catch (Exception e) {
System.out.println("Exception starting RMI registry:");
e.printStackTrace();
}
this.propFile = properties;
mbs = MBeanServerFactory.createMBeanServer();
url = new JMXServiceURL(formJMXServiceURLString(DEFAULT_HOST, "" + port));
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
loadMBeans();
}
private String formJMXServiceURLString(String host, String port)
throws UnknownHostException {
/*
* String jmxSerURL = "service:jmx:rmi://" + serverName + "/jndi/rmi://" +
* serverName + ":" + port + "/jmxrmi";
*/
String jmxSerURL = "";
InetAddress inetAddr = InetAddress.getByName(host);
if (inetAddr instanceof Inet4Address) {
// Create jmx service url for IPv4 address
jmxSerURL = "service:jmx:rmi://" + host + "/jndi/rmi://" + host + ":"
+ port + "/jmxrmi";
} else if (inetAddr instanceof Inet6Address) {
// Create jmx service url for IPv6 address
jmxSerURL = "service:jmx:rmi://[" + host + "]/jndi/rmi://[" + host + "]:"
+ port + "/jmxrmi";
}
return jmxSerURL;
}
public void stop() {
try {
cs.stop();
} catch (IOException e) {
e.printStackTrace();
}
}
private synchronized void loadMBeans() {
unregisterAll();
JMXProperties props = JMXProperties.getInstance();
try {
props.load(propFile);
} catch (IOException e) {
e.printStackTrace();
}
// Add servers
String[] servers = getArrayProperty(props, "servers");
for (String server : servers) {
try {
addServerMBean(server);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
// Add GemFireXD Cluster
String[] gemFireXDClusters = getArrayProperty(props, "gemfirexdclusters");
for (String xdCluster : gemFireXDClusters) {
try {
addGemFireXDClusterMbean(xdCluster);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
// Add members
String[] members = getArrayProperty(props, "members");
for (String m : members) {
try {
addMemberMBean(m);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
// Add GemFireXD members
String[] gemfirexdmember = getArrayProperty(props, "gemfirexdmembers");
for (String xdm : gemfirexdmember) {
try {
addGemFireXDMemberMBean(xdm);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
// Add regions
String[] regions = getArrayProperty(props, "regions");
for (String reg : regions) {
try {
addRegionMBean(reg);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
// Add GemFireXD Aggregate Tables
String[] aggTables = getArrayProperty(props, "tables");
for (String aggTable : aggTables) {
try {
addGemFireXDAggregateTableMBean(aggTable);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
// Add aggregate queries
System.out.println("loading aggregate queries mbeans ...");
String[] aggregatequeries = getArrayProperty(props, "aggregatequeries");
for (String aggregateq : aggregatequeries) {
try {
System.out.println("adding mbean .. " + aggregateq);
addAggregateQueryMBean(aggregateq);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
System.out.println("Finished registering # mbeans .. " + aggregatequeries.length);
}
private void addMemberMBean(String m) throws InstanceAlreadyExistsException,
MBeanRegistrationException, NotCompliantMBeanException,
MalformedObjectNameException, NullPointerException {
Member m1 = new Member(m);
mbs.registerMBean(m1, new ObjectName(Member.OBJECT_NAME + ",member=" + m));
}
// For GemFire XD
private void addGemFireXDMemberMBean(String xdm)
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException, MalformedObjectNameException,
NullPointerException {
GemFireXDMember xdmo = new GemFireXDMember(xdm);
mbs.registerMBean(xdmo, new ObjectName(GemFireXDMember.OBJECT_NAME
+ ",member=" + xdm));
}
private void addRegionMBean(String reg)
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException, MalformedObjectNameException,
NullPointerException {
Region regionObject = new Region(reg);
mbs.registerMBean(regionObject, new ObjectName(Region.OBJECT_NAME + ",name=/" + reg));
System.out.println("Region Full path : " + regionObject.getFullPath());
for (String member : regionObject.getMembers()) {
System.out.println("Adding Region on Member MBean for Region: " + reg + ", Member: " + member);
RegionOnMember regionOnMemberObject = new RegionOnMember(regionObject.getFullPath());
mbs.registerMBean(regionOnMemberObject, new ObjectName(
"GemFire:service=Region,name=/"+ regionObject.getFullPath() + ",type=Member,member=" + member));
System.out.println("Region on member properties retrieved : entryCount=" + regionOnMemberObject.getEntryCount() +",entrySize="
+ regionOnMemberObject.getEntrySize() + ",localMaxMemory=" +regionOnMemberObject.getLocalMaxMemory());
}
}
// For GemFire XD
private void addGemFireXDAggregateTableMBean(String aggTable)
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException, MalformedObjectNameException,
NullPointerException {
GemFireXDAggregateTable tableObject = new GemFireXDAggregateTable(aggTable);
mbs.registerMBean(tableObject, new ObjectName(GemFireXDAggregateTable.OBJECT_NAME + aggTable));
}
private void addServerMBean(String server)
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException, MalformedObjectNameException,
NullPointerException {
ServerObject so = new ServerObject(server);
mbs.registerMBean(so, new ObjectName(ServerObject.OBJECT_NAME));
}
// For GemFire XD
private void addGemFireXDClusterMbean(String cluster)
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException, MalformedObjectNameException,
NullPointerException {
GemFireXDCluster xdco = new GemFireXDCluster(cluster);
mbs.registerMBean(xdco, new ObjectName(GemFireXDCluster.OBJECT_NAME));
}
private void addAggregateQueryMBean(String aggregateq)
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException, MalformedObjectNameException,
NullPointerException {
AggregateStatement aggregatestatement = new AggregateStatement(aggregateq);
System.out.println("created statement mbean ..." + aggregatestatement + ", query defn = " + ObjectName.quote(aggregatestatement.getQueryDefinition()));
System.out.println("qnRespDeSerTime ...qnRespDeSerTime = " + aggregatestatement.getQNRespDeSerTime());
Object returnObj = mbs.registerMBean(aggregatestatement, new ObjectName(AggregateStatementMBean.OBJECT_NAME + ",name=" + ObjectName.quote(aggregatestatement.getQueryDefinition())));
System.out.println("registered mbean ..." + returnObj );
}
private String[] getArrayProperty(JMXProperties props, String propName) {
String propVal = props.getProperty(propName, "");
return propVal.split(" ");
}
private void unregisterAll() {
Set<ObjectName> thisSet = mbs.queryNames(null, null);
for (ObjectName objectName : thisSet) {
System.out.println("Removing ..." + objectName.getCanonicalName());
/*try {
mbs.unregisterMBean(objectName);
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (InstanceNotFoundException e) {
e.printStackTrace();
}*/
}
}
public static void main(String[] args) throws MalformedObjectNameException,
NullPointerException {
int port = DEFAULT_PORT;
String props = null;
if (args.length >= 2) {
try {
port = Integer.parseInt(args[0]);
props = args[1];
} catch (NumberFormatException nfe) {
port = DEFAULT_PORT;
props = null;
nfe.printStackTrace();
}
}
createServer(port, props);
}
public static Server createServer(int port, String properties)
throws MalformedObjectNameException {
Server s = null;
try {
s = new Server(port, properties);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return s;
}
}