javacommand-linejmxmbeans

How to pass parameters into JMX MBean function from command line


I am trying to remotely invoke an MBean via a commandline. Right now, I am able to list attributes and operations. For example, I can list all the attributes and operations for HotspotDiagnostic using this command:

java -jar cmdline-jmxclient-0.10.3.jar admin:P@sSw0rd 10.11.12.13:1111 com.sun.management:type=HotSpotDiagnostic

Which gives me this list of Attributes and Operations

Attributes:
 DiagnosticOptions: DiagnosticOptions (type=[Ljavax.management.openmbean.CompositeData;)
 ObjectName: ObjectName (type=javax.management.ObjectName)
Operations:
 dumpHeap: dumpHeap
  Parameters 2, return type=void
   name=p0 type=java.lang.String p0
   name=p1 type=boolean p1
 getVMOption: getVMOption
  Parameters 1, return type=javax.management.openmbean.CompositeData
   name=p0 type=java.lang.String p0
 setVMOption: setVMOption
  Parameters 2, return type=void
   name=p0 type=java.lang.String p0
   name=p1 type=java.lang.String p1

But now lets say I want to invoke the dumpHeap operation which takes two parameters p0 and p1 of type string and boolean, respectively. How would I pass those arguments in?

I've tried these:

java -jar cmdline-jmxclient-0.10.3.jar admin:P@sSw0rd10.11.12.13:1111 com.sun.management:type=HotSpotDiagnostic dumpHeap p0=aaa p1=true

java -jar cmdline-jmxclient-0.10.3.jar admin:P@sSw0rd10.11.12.13:1111 com.sun.management:type=HotSpotDiagnostic dumpHeap aaa true

But I'm not sure what the syntax is, or even what I'm supposed to pass for the string parameter. This isn't for anything specific btw. Merely want to learn and understand more about how to leverage these operations from the command line. Any docs and assistance much appreciated.

EDIT: I'm naive. Oracle docs indicate the string param is an output file per this link. But still uncertain about how to pass the parameters into my command.


Solution

  • According to the cmdline-jmxclient documentation: http://crawler.archive.org/cmdline-jmxclient/ you have to use comma-delimited parameters to pass to your operation.

    So in your case if would be:

    java -jar cmdline-jmxclient-0.10.3.jar admin:P@sSw0rd10.11.12.13:1111 com.sun.management:type=HotSpotDiagnostic dumpHeap test,true
    

    Take note that there is an present bug in the cmdline jar file that doesn't take into account Java primitives(int, booelean, byte, etc.) and will throw a ClassNotFoundException because it can't find by the primitive name.

    If you find yourself coming across this issue you can either apply the patch to the jar code that is documented here: https://webarchive.jira.com/browse/HER-1630. Or simply change the type field in the jmx endpoint code from it's primitive type to it's Wrapper object type (int -> Integer)