Author: gdusbabek Date: Mon May 10 17:24:31 2010 New Revision: 942822 URL: http://svn.apache.org/viewvc?rev=942822&view=rev Log: optional mini-admin node interface. Patch by Ran Tavory, reviewed by Gary Dusbabek. CASSANDRA-1068
Added: cassandra/trunk/src/java/org/apache/cassandra/utils/Mx4jTool.java Modified: cassandra/trunk/CHANGES.txt cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraDaemon.java cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraDaemon.java Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=942822&r1=942821&r2=942822&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Mon May 10 17:24:31 2010 @@ -22,6 +22,7 @@ dev * removed multiget thrift method (CASSANDRA-739) * removed deprecated batch_insert and get_range_slice methods (CASSANDRA-1065) * add truncate thrift method (CASSANDRA-531) + * http mini-interface using mx4j (CASSANDRA-1068) 0.6.2 Modified: cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraDaemon.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraDaemon.java?rev=942822&r1=942821&r2=942822&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraDaemon.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraDaemon.java Mon May 10 17:24:31 2010 @@ -32,6 +32,7 @@ import org.apache.cassandra.db.Table; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; +import org.apache.cassandra.utils.Mx4jTool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -113,6 +114,7 @@ public class CassandraDaemon { SpecificResponder responder = new SpecificResponder(Cassandra.class, new CassandraServer()); logger.info("Cassandra starting up..."); + Mx4jTool.maybeLoad(); // FIXME: This isn't actually binding to listenAddr (it should). server = new HttpServer(responder, listenPort); } Modified: cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraDaemon.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraDaemon.java?rev=942822&r1=942821&r2=942822&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraDaemon.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraDaemon.java Mon May 10 17:24:31 2010 @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import org.apache.log4j.PropertyConfigurator; +import org.apache.cassandra.utils.Mx4jTool; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocolFactory; @@ -155,6 +156,7 @@ public class CassandraDaemon public void start() { logger.info("Cassandra starting up..."); + Mx4jTool.maybeLoad(); serverEngine.serve(); } Added: cassandra/trunk/src/java/org/apache/cassandra/utils/Mx4jTool.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/Mx4jTool.java?rev=942822&view=auto ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/utils/Mx4jTool.java (added) +++ cassandra/trunk/src/java/org/apache/cassandra/utils/Mx4jTool.java Mon May 10 17:24:31 2010 @@ -0,0 +1,76 @@ +package org.apache.cassandra.utils; + +import java.lang.management.ManagementFactory; + +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * If mx4j-tools is in the classpath call maybeLoad to load the HTTP interface of mx4j. + * + * The default port is 8081. To override that provide e.g. -Dmx4jport=8082 + * The default listen address is 0.0.0.0. To override that provide -Dmx4jaddress=127.0.0.1 + */ +public class Mx4jTool +{ + private static final Logger logger = LoggerFactory.getLogger(Mx4jTool.class); + + /** + * Starts a JMX over http interface if and mx4j-tools.jar is in the classpath. + * @return true if successfully loaded. + */ + public static boolean maybeLoad() + { + try + { + logger.debug("Will try to load mx4j now, if it's in the classpath"); + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + ObjectName processorName = new ObjectName("Server:name=XSLTProcessor"); + + Class<?> httpAdaptorClass = Class.forName("mx4j.tools.adaptor.http.HttpAdaptor"); + Object httpAdaptor = httpAdaptorClass.newInstance(); + httpAdaptorClass.getMethod("setHost", String.class).invoke(httpAdaptor, getAddress()); + httpAdaptorClass.getMethod("setPort", Integer.TYPE).invoke(httpAdaptor, getPort()); + + ObjectName httpName = new ObjectName("system:name=http"); + mbs.registerMBean(httpAdaptor, httpName); + + Class<?> xsltProcessorClass = Class.forName("mx4j.tools.adaptor.http.XSLTProcessor"); + Object xsltProcessor = xsltProcessorClass.newInstance(); + httpAdaptorClass.getMethod("setProcessor", Class.forName("mx4j.tools.adaptor.http.ProcessorMBean")). + invoke(httpAdaptor, xsltProcessor); + mbs.registerMBean(xsltProcessor, processorName); + httpAdaptorClass.getMethod("start").invoke(httpAdaptor); + logger.info("mx4j successfuly loaded"); + return true; + } + catch (ClassNotFoundException e) + { + logger.info("Will not load MX4J, mx4j-tools.jar is not in the classpath"); + } + catch(Exception e) + { + logger.warn("Could not start register mbean in JMX", e); + } + return false; + } + + private static String getAddress() + { + return System.getProperty("mx4jaddress", FBUtilities.getLocalAddress().getHostAddress()); + } + + private static int getPort() + { + int port = 8081; + String sPort = System.getProperty("mx4jport"); + if (sPort != null && !sPort.equals("")) + { + port = Integer.parseInt(sPort); + } + return port; + } +}