熟悉了JMX後,遇到的問題是MBean位於遠程伺服器上,訪問需要使用RMI,剛好JMX也提供RMI的方法
以上一篇提到的JMX樣本HelloAgent.java為基礎
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class HelloAgent {
public static void main(String[] args) throws Exception
{
MBeanServer server=ManagementFactory.getPlatformMBeanServer();
ObjectName helloName=new ObjectName("tina:name=Hello World");
server.registerMBean(new Hello(), helloName);
//ObjectName adapterName =new ObjectName("HelloAgent:name=htmladapter,port=8033"); 使用Jconsole時可以不用此四行代碼
//HtmlAdaptorServer adaptor=new HtmlAdaptorServer();
//server.registerMBean(adaptor, adapterName);
//adaptor.setPort(8033);
adaptor.start();
System.out.println("start.....");//以下四行為新增代碼
JMXServiceURL url=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnectorServer cs=JMXConnectorServerFactory.newJMXConnectorServer(url, null,server);
cs.start();
System.out.println("rmi start......");
}
}
其他兩個類檔案不變
然後,在終端切換到jdk/bin目錄下 運行命令:rmiregistry 9999
接著,運行HelloAgent, 正常顯示start....rmi start....後,再在終端運行命令jconsole,輸入service:jmx:rmi:///jndi/rmi://localhost:9999/server
即可看到暴露出來的HelloMBean
過程中可能出現的問題
1.在運行HelloAgent後,可能回報這樣的錯Cannot bind to URL [rmi:localhost:9999/server]
查了資料,這種錯誤可能是由於JDK版本的問題,保證在1.5+就可以解決
我的JDK是1.6 後來仔細看錯誤資訊,發現我在輸入地址時忘記在localhost前面加“//”,所以找不到,下次要細心嘍
遠端存取MBean,搞定。