如何在远程Glassfish服务器上激活JMX以便使用jconsole进行访问?

时间:2009-08-05 08:26:29

标签: java glassfish jmx jconsole

我想监控远程glassfish服务器。我在domain.xml中启用了JMX Connection:

<jmx-connector accept-all="true" address="0.0.0.0" auth-realm-name="admin-realm" enabled="true" name="system" port="8686" protocol="rmi_jrmp" security-enabled="false">

但这没有用。我仍然无法使用JConsole连接到服务器。然后我找到了解决方案 - 我需要在domain.xml中指定JVM属性以打开8686端口进行远程连接。 所以我将这些行添加到 java-config 部分:

<jvm-options>-Dcom.sun.management.jmxremote</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.port=8686</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.local.only=false</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.authenticate=false</jvm-options>

但是现在当我启动服务器时,我遇到了以下错误:

  

无法加载Logmanager   “com.sun.enterprise.server.logging.ServerLogManager”   抛出java.lang.ClassNotFoundException:   com.sun.enterprise.server.logging.ServerLogManager           在java.net.URLClassLoader $ 1.run(URLClassLoader.java:200)           在java.security.AccessController.doPrivileged(Native   方法)           在java.net.URLClassLoader.findClass(URLClassLoader.java:188)           at java.lang.ClassLoader.loadClass(ClassLoader.java:307)           在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)           at java.lang.ClassLoader.loadClass(ClassLoader.java:252)           在java.util.logging.LogManager $ 1.run(LogManager.java:166)           在java.security.AccessController.doPrivileged(Native   方法)           在java.util.logging.LogManager。(LogManager.java:156)           在java.util.logging.Logger.getLogger(Logger.java:273)           at sun.management.snmp.util.MibLogger。(MibLogger.java:57)           at sun.management.snmp.util.MibLogger。(MibLogger.java:42)           at sun.management.jmxremote.ConnectorBootstrap。(ConnectorBootstrap.java:760)           在sun.management.Agent.startAgent(Agent.java:127)           at sun.management.Agent.startAgent(Agent.java:239)   javax.management.JMRuntimeException:   无法加载MBeanServerBuilder   类   com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder:   抛出java.lang.ClassNotFoundException:   com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder           在javax.management.MBeanServerFactory.checkMBeanServerBuilder(MBeanServerFactory.java:480)           在javax.management.MBeanServerFactory.getNewMBeanServerBuilder(MBeanServerFactory.java:511)           在javax.management.MBeanServerFactory.newMBeanServer(MBeanServerFactory.java:298)           在javax.management.MBeanServerFactory.createMBeanServer(MBeanServerFactory.java:213)           在javax.management.MBeanServerFactory.createMBeanServer(MBeanServerFactory.java:174)           at sun.management.ManagementFactory.createPlatformMBeanServer(ManagementFactory.java:302)           at java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:504)           at sun.management.jmxremote.ConnectorBootstrap.initialize(ConnectorBootstrap.java:392)           在sun.management.Agent.startAgent(Agent.java:127)           at sun.management.Agent.startAgent(Agent.java:239)   引起:   抛出java.lang.ClassNotFoundException:   com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder           在java.net.URLClassLoader $ 1.run(URLClassLoader.java:200)           在java.security.AccessController.doPrivileged(Native   方法)           在java.net.URLClassLoader.findClass(URLClassLoader.java:188)           at java.lang.ClassLoader.loadClass(ClassLoader.java:307)           在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)           at java.lang.ClassLoader.loadClass(ClassLoader.java:252)           在javax.management.MBeanServerFactory.loadBuilderClass(MBeanServerFactory.java:423)           在javax.management.MBeanServerFactory.checkMBeanServerBuilder(MBeanServerFactory.java:465)           ... 9更多代理抛出的异常:   javax.management.JMRuntimeException:   无法加载MBeanServerBuilder   类   com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder:   抛出java.lang.ClassNotFoundException:   com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder

我该如何解决问题?

提前致谢。

5 个答案:

答案 0 :(得分:3)

解决问题的步骤是: 1.使用默认设置 2.在GlassFish实例的JVM选项中添加-Djava.rmi.server.hostname =。

答案 1 :(得分:3)

仍然是神秘的行为,但是通过这4个设置,您可以连接到运行Glassfish的JVM(在管理控制台中添加到domain.xml,需要重新启动)

-Djava.rmi.server.hostname=yourhost
-Dcom.sun.management.jmxremote.port=8686
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

小心!这是不安全的,因为现在任何人都可以将jconsole连接到它!

IMO这不是使用JMX连接器的Glassfish方式。

(以上适用于GF 3.1)

答案 2 :(得分:2)

我最终设置了以下选项,以确保带有Glassfish的JMX对防火墙友好:

<jvm-options>-Dcom.sun.aas.jconsole.server.cbport=XXXX</jvm-options>

其中XXXX是您在防火墙中使用的端口号以及应用程序服务器配置的JMX端口号(通常为8686)。

this blogpost中阅读更多内容。请注意,此功能需要较新版本的Glassfish。我已经成功地将它与Glassfish 2.1.1一起使用。

答案 3 :(得分:0)

不是GlassFish issue 1409吗?

答案 4 :(得分:0)

如果在Glassfish应用服务器中运行您的应用程序,只需运行以下asadmin命令,您需要重新启动所有正在运行的服务器才能使更改生效。

./ asadmin enable-secure-admin

还有额外的Glassfish服务器配置可以进一步提高安全性,详见Connecting remotely to Glassfish through JMX

您确实需要遵循JVM选项上的步骤,这些是一般Java应用程序的说明。对于使用Glassfish应用程序服务器运行的Java应用程序,只需使用asadm命令即可。这为我节省了很多时间!

**另一个注意事项,只有使用JVM选项的设置,Glassfish将无法启动上述运行时异常。 **我使用的是GF3.1.2及更高版本,以及Java 7。