2007年11月14日星期三

使用RMI方式调用JBoss的MBean


JBoss采用JMX的MBean来进行资源管理及监控的任务,用户可以自行定义自己的MBean,在容器内执行。JBoss提供了HTTP和RMI两种接口来调用MBean,HTTP方式用于jmx-console,可以在网页上查看MBean信息并执行其中的方法。RMI接口用于远程调用,具体步骤是:
  1. 通过JNDI查找jmx/invoker/RMIAdaptor得到RMIAdaptor的实例
  2. 通过构造ObjectName对象,传入RMIAdaptor定位具体的MBean实例
  3. 调用RMIAdaptor的invoke()方法执行MBean的方法
代码清单如下:

import java.util.Properties;
import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.jboss.jmx.adaptor.rmi.RMIAdaptor;

public class JbossJMXBrowser {
   
    private ObjectName name;
    private RMIAdaptor server;

    public JbossJMXBrowser(String host, String objectName) throws Exception {
        Properties props = new Properties();
        props.put("java.naming.factory.initial", " org.jnp.interfaces.NamingContextFactory");
        props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces ");
        props.put("java.naming.provider.url", host);
        Context ctx = new InitialContext(props);
        server = (RMIAdaptor) ctx.lookup("jmx/invoker/RMIAdaptor");
        name = new ObjectName(objectName);
    }
   
    public Object invoke(String operationName, Object[] params, String[] signatures) throws Exception{
        return server.invoke(name, operationName, params, signatures);
    }
   
    public MBeanInfo getMBeanInfo() throws Exception{
        return server.getMBeanInfo(name);
    }

    private void printOperationInfo(MBeanInfo info) {
        MBeanOperationInfo[] oprerations = info.getOperations ();
        MBeanOperationInfo op = null;
        for (MBeanOperationInfo mBeanOperationInfo : oprerations) {
                op = mBeanOperationInfo;
                System.out.println(op.getName() + " " + op.getReturnType());
                for (MBeanParameterInfo paramInfo : op.getSignature()) {
                    if (paramInfo.getName().equals(paramInfo.getType())) {
                        System.out.println(paramInfo.getType());
                    } else {
                        System.out.println(paramInfo.getType() + " " + paramInfo.getName());
                    }
                }
        }
    }
   
    public static void main(String[] args) throws Exception {
        JbossJMXBrowser browser = new JbossJMXBrowser("10.100.1.156:1099", "jboss.system:type=ServerInfo ");
        MBeanInfo info = browser.getMBeanInfo();
        System.out.println("MBean Name: " + info.getClassName());
        browser.printOperationInfo(info);
        String[] sig = {"boolean"};
        Object[] opArgs = {Boolean.TRUE};
        Object result = browser.invoke("listMemoryPools", opArgs, sig);
        System.out.println (result);
    }
}

以上代码编译运行需要jbossall-client.jar 。

没有评论: