2013-05-16 31 views
0

如何使用没有JConsole的JMX执行方法?使用没有JConsole的JMX执行方法

我想从Java代码通过JMX调用方法。用下面的代码我可以得到MBean接口的所有方法的名称,但我还没有能够实际地执行他们。有些东西仍然缺失,有谁能帮我吗?

private static String connectJmx() { 
    StringBuilder sb = new StringBuilder(); 

    JMXServiceURL serviceUrl; 
    JMXConnector jmxConnector = null; 
    try { 
     serviceUrl = new JMXServiceURL(URL); 
     jmxConnector = JMXConnectorFactory.connect(serviceUrl, null); 
     MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection(); 

     ObjectName objectName = ObjectNameProvider.getObjectName(); 
     MBeanInfo info = mbeanConn.getMBeanInfo(objectName); 

     MBeanOperationInfo[] operations = info.getOperations();   
     for (int i = 0; i < operations.length; i++) { 
     sb.append(operations[i].getName()).append("\n"); 
     } 

    } 
    catch (Exception e) { 
     LogManager.doLog(LOG, LOGLEVEL.INFO, "exception connection jmx", e); 

    } finally { 
     try { 
      if(jmxConnector != null){ 
       jmxConnector.close(); 
      } 
     } catch (IOException e) { 
     // 
     } 
    }  
    return sb.toString(); 
} 

上面的for循环收集了方法的名称。我想要类似的东西,而不是收集名称,实际上执行它们。 请不要推荐JConsole,它不起作用的其他原因。

+0

*“请不要推荐JConsole的,它不会因为其他原因的工作。 “*请说明原因。 –

+0

我们希望将此功能嵌入到我们的应用程序中,因此,当我们分发给客户端时,他们可以使用Jconsole –

回答

1

你还没有把代码调用一个mbean方法。下面是一个示例代码,以帮助您处理:

import javax.management.*; 
import javax.management.remote.*; 
import com.sun.messaging.AdminConnectionFactory; 
import com.sun.messaging.jms.management.server.*; 


public class InvokeOp 
    { 
    public static void main (String[] args) 
     { 
     try 
      { // Create administration connection factory 
       AdminConnectionFactory acf = new AdminConnectionFactory(); 

      // Get JMX connector, supplying user name and password 
       JMXConnector jmxc = acf.createConnection("AliBaba", "sesame"); 

      // Get MBean server connection 
       MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 

      // Create object name 
       ObjectName serviceConfigName = MQObjectName.createServiceConfig("jms"); 

      // Invoke operation 
       mbsc.invoke(serviceConfigName, ServiceOperations.PAUSE, null, null); 

      // Close JMX connector 
       jmxc.close(); 
      } 

     catch (Exception e) 
      { System.out.println("Exception occurred: " + e.toString()); 
      e.printStackTrace(); 
      } 
     } 
    } 
+0

而不是“ServiceOperations.PAUSE”,我们需要指定方法的名称,然后才能使用。 –