【问题标题】:Execute a method with JMX without JConsole使用没有 JConsole 的 JMX 执行方法
【发布时间】:2013-05-16 09:35:52
【问题描述】:

如何在没有 JConsole 的情况下使用 JMX 执行方法?

我想通过 JMX 从 Java 代码调用方法。通过下面的代码,我可以获得 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,因为其他原因它不起作用。

【问题讨论】:

  • “请不要推荐JConsole,因为其他原因它不起作用。”请给出原因。
  • 我们希望将此功能嵌入到我们的应用程序中,因此当我们分发给客户时,他们可以在没有 Jconsole 的情况下使用

标签: java methods jmx invoke


【解决方案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();
          }
      }
  }

【讨论】:

  • 我们需要指定方法的名称,而不是这个 'ServiceOperations.PAUSE',然后它才能工作。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多