admin 管理员组

文章数量: 887021


2024年1月17日发(作者:idea导入tomcat服务器)

因为需要写一个后台监控服务器的程序,涉及到jmx,也涉及到分布式的问题,最初在网上找相关资料的时候很少很少,后来才知道其实jmx这一块相关资料已经很多,java网站上已有比较多的完整例子。

最初使用jmx比较简单,安装java官网的例子很快就写出来了几个例子,但在应用中需要结合tomcat来使用,出现了一些问题,比如获取本地的MBeanServer时出错,网上查了些资料发现需要使用tomcat的一些东西,因此该为如下的方式获取MBeanServer即可

Java代码

1. /**

2. * 获取本地MBeanServer

3. * @return

4. */

5. private MBeanServer getLocalMBServer(){

6. MBeanServer mBeanServer = null;

7. if (eanServer(null).size() > 0) {

8. mBeanServer =(MBeanServer) eanServer(null).get(0);

9. } else {

10. mBeanServer = MBeanServer();

11. }

12. return mBeanServer;

13. }

获取远程MBeanServerConnection时则是一个很严重的问题,最初使用如下方法

Java代码

1. private MBeanServerConnection getRemoteMBConn(){

2. // String user = "monitorRole";

3. // String pw = "password";

4. // String[] credentials = new String[] { user, pw };

5. // Map props = new HashMap();

6. // ("tials", credentials);

7. JMXServiceURL address;

8. MBeanServerConnection mbs=null;

9. String jmxServerIp=tance().getOampConfig(_SERVER_IP);//127.0.0.1

10. String jmxServerPort=tance().getOampConfig(_SERVER_PORT);//9999

11. try {

12.// address =new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9999/jmxrmi");

13. address =new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"+jmxServerIp+":"+jmxServerPort+"/jmxrmi");

14. JMXConnector connector = t(address, null);

15.// address = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi");

16.// JMXConnector connector = t(address, props);

17. mbs= anServerConnection();

18. t();

19. } catch (Exception e) {

20. ("oamp", , "Fail to getRemoteMBConn", e);

21. }

22. return mbs;

23. }

在一台机器上时并没有出现啥问题,一切运行正常,当我使用两台机器进行测试的时候则会出现异常,这个异常在网上搜了一下,相关的资料却很少很少,虽然自己也能看到后面具体的错误,

Java代码

1. ption: Failed to retrieve RMIServer stub: ialContextException: Cannot instantiate class: LContextFactory [Root exception is otFoundException: LContextFactory]

这个异常在tomcat启动完成之后,再获取链接则会抛出此异常,不知该咋解决呢,后来想到用rmi的另外一种地址形式,但还是不行,因为都走的是同一个思路。

参考了/html/api/sun/tools/jconsole/这个网站上的代码,发现获取MBeanServerConnection有两种方式,具体的不是很清楚,只知道本地和远程有一些区别,因此自己试了一下居然就解决了两台机器间获取MBeanServerConnection的问题。修改的代码如下

Java代码

1. /**

2. * 获取远程MBeanServerConnection

3. * @return

4. */

5. private MBeanServerConnection getRemoteMBConn(String ip,String port){

6. // String user = "monitorRole";

7. // String pw = "password";

8. // String[] credentials = new String[] { user, pw };

9. // Map props = new HashMap();

10.// ("tials", credentials);

11.

12.// JMXServiceURL address;

13.// (,"getRemoteMBConn ip="+ip+";port="+port);

14.// MBeanServerConnection mbs=null;

15.// try {

16.// address =new JMXServiceURL("service:jmx:rmi://"+ip+"/jndi/rmi://"+ip+":"+port+"/jmxrmi");

17.// JMXConnector connector = t(address, null);

18.// mbs= anServerConnection();

19. if(y(ip)||y(port)){

20. return null;

21. }

22. try{

23. MBeanServerConnection mbs=null;

24. Registry registry=istry(ip, nt(port));

25. RMIServer stub=null;

26. JMXConnector jmxc=null;

27. if (stub == null) {

28. stub = (RMIServer) ("jmxrmi");

29. }

30. jmxc = new RMIConnector(stub, null);

31. t();

32. mbs=anServerConnection();

33. (ip, mbs);

34. return mbs;

35. } catch (Exception e) {

36.// tackTrace();

37. ("oamp", , "Fail to getRemoteMBConn", e);

38. }

39. return null;

40. }


本文标签: 获取 问题 使用 需要 形式