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;
+    }
+}


Reply via email to