Author: markt
Date: Sun Jan 15 21:37:18 2012
New Revision: 1231762
URL: http://svn.apache.org/viewvc?rev=1231762&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=38216
Add the ability to invoke MBean operations through the JMXProxy
Based on a patch by Christopher Hlubek
Also improved error reporting to help debugging.
Modified:
tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java
tomcat/trunk/webapps/docs/manager-howto.xml
Modified: tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java?rev=1231762&r1=1231761&r2=1231762&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java Sun Jan
15 21:37:18 2012
@@ -14,16 +14,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-
package org.apache.catalina.manager;
-
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;
import javax.management.Attribute;
+import javax.management.MBeanOperationInfo;
+import javax.management.MBeanParameterInfo;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.servlet.ServletException;
@@ -101,6 +100,19 @@ public class JMXProxyServlet extends Htt
getAttribute( writer, qry, name );
return;
}
+ qry = request.getParameter("invoke");
+ if(qry != null) {
+ String opName=request.getParameter("op");
+ String ps = request.getParameter("ps");
+ String[] valuesStr;
+ if (ps == null) {
+ valuesStr = new String[0];
+ } else {
+ valuesStr = request.getParameter("ps").split(",");
+ }
+ invokeOperation( writer, qry, opName,valuesStr );
+ return;
+ }
qry=request.getParameter("qry");
if( qry == null ) {
qry = "*:*";
@@ -117,7 +129,8 @@ public class JMXProxyServlet extends Htt
writer.println("OK - Attribute get '" + onameStr + "' - " + att
+ "= " + MBeanDumper.escape(value.toString()));
} catch (Exception ex) {
- writer.println("Error - " + ex.toString());
+ writer.println("Error");
+ ex.printStackTrace(writer);
}
}
@@ -131,7 +144,8 @@ public class JMXProxyServlet extends Htt
mBeanServer.setAttribute( oname, new Attribute(att, valueObj));
writer.println("OK - Attribute set");
} catch( Exception ex ) {
- writer.println("Error - " + ex.toString());
+ writer.println("Error");
+ ex.printStackTrace(writer);
}
}
@@ -143,8 +157,9 @@ public class JMXProxyServlet extends Htt
names=mBeanServer.queryNames(new ObjectName(qry), null);
writer.println("OK - Number of results: " + names.size());
writer.println();
- } catch (Exception e) {
- writer.println("Error - " + e.toString());
+ } catch (Exception ex) {
+ writer.println("Error");
+ ex.printStackTrace(writer);
return;
}
@@ -161,4 +176,38 @@ public class JMXProxyServlet extends Htt
public boolean isSupported(String type) {
return true;
}
+
+
+ private void invokeOperation(PrintWriter writer, String onameStr, String
op,
+ String[] valuesStr) {
+ try {
+ ObjectName oname=new ObjectName( onameStr );
+ MBeanOperationInfo methodInfo = registry.getMethodInfo(oname,op);
+ MBeanParameterInfo[] signature = methodInfo.getSignature();
+ String[] signatureTypes = new String[signature.length];
+ Object[] values = new Object[signature.length];
+ for (int i = 0; i < signature.length; i++) {
+ MBeanParameterInfo pi = signature[i];
+ signatureTypes[i] = pi.getType();
+ values[i] = registry.convertValue(pi.getType(), valuesStr[i] );
+ }
+
+ Object retVal = mBeanServer.invoke(oname,op,values,signatureTypes);
+ writer.println("OK - Operation " + op + " returned:");
+ output("", writer, retVal);
+ } catch( Exception ex ) {
+ writer.println("Error");
+ ex.printStackTrace(writer);
+ }
+ }
+
+ private void output(String indent, PrintWriter writer, Object result) {
+ if (result instanceof Object[]) {
+ for (Object obj : (Object[]) result) {
+ output(" " + indent, writer, obj);
+ }
+ } else {
+ writer.println(indent + result.toString());
+ }
+ }
}
Modified: tomcat/trunk/webapps/docs/manager-howto.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/manager-howto.xml?rev=1231762&r1=1231761&r2=1231762&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/manager-howto.xml (original)
+++ tomcat/trunk/webapps/docs/manager-howto.xml Sun Jan 15 21:37:18 2012
@@ -1301,6 +1301,18 @@ Error: java.lang.NumberFormatException:
</source>
</subsection>
+ <subsection name="JMX Invoke command">
+ <p>The <code>invoke</code> command enables methods to be called on MBeans.
The
+ general form of the command is:</p>
+<source>
+http://webserver/manager/jmxproxy/?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS
+</source>
+ <p>For exmaple, to call the <code>findConnectors()</code> method of the
+ <strong>Service</strong> use:</p>
+<source>
+http://localhost:8080/manager/jmxproxy/?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=
+</source>
+ </subsection>
</section>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]