JBoss采用JMX的MBean来进行资源管理及监控的任务,用户可以自行定义自己的MBean,在容器内执行。JBoss提供了HTTP和RMI两种接口来调用MBean,HTTP方式用于jmx-console,可以在网页上查看MBean信息并执行其中的方法。RMI接口用于远程调用,具体步骤是:
- 通过JNDI查找jmx/invoker/RMIAdaptor得到RMIAdaptor的实例
- 通过构造ObjectName对象,传入RMIAdaptor定位具体的MBean实例
- 调用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 。
没有评论:
发表评论