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

5

我希望能够监控远程的GlassFish服务器。我已经在domain.xml中启用了JMX连接:

<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 Method)之后,在java.net.URLClassLoader.findClass(URLClassLoader.java:188)和ClassLoader.loadClass(ClassLoader.java:307)之后,sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)和java.lang.ClassLoader.loadClass(ClassLoader.java:252)也无法解决问题。
在java.util.logging.LogManager$1.run(LogManager.java:166)处发生了错误,并且在java.security.AccessController.doPrivileged(Native Method)之后,java.util.logging.LogManager.(LogManager.java:156)无法解决问题。此外,Logger.getLogger(Logger.java:273)、sun.management.snmp.util.MibLogger.(MibLogger.java:57)和sun.management.snmp.util.MibLogger.(MibLogger.java:42)也无法解决问题。
在sun.management.jmxremote.ConnectorBootstrap.(ConnectorBootstrap.java:760)处发生了错误,并且在sun.management.Agent.startAgent(Agent.java:127)和sun.management.Agent.startAgent(Agent.java:239)之后,javax.management.JMRuntimeException: Failed to load MBeanServerBuilder class com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder: java.lang.ClassNotFoundException: com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder也无法解决问题。
最后,java.lang.ClassNotFoundException: com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder在java.net.URLClassLoader$1.run(URLClassLoader.java:200)处发生了错误,并且在java.security.AccessController.doPrivileged(Native Method)之后,在java.net.URLClassLoader.findClass(URLClassLoader.java:188)和ClassLoader.loadClass(ClassLoader.java:307)之后,sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)和java.lang.ClassLoader.loadClass(ClassLoader.java:252)也无法解决问题。

我该如何解决这个问题?

提前致谢。

5个回答

5

这个行为仍然神秘,但通过以下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!

在我看来,这不是Glassfish的方式,Glassfish使用JMX连接器。

(以上适用于GF 3.1)


非常感谢。这正是我一直在寻找的答案,以远程连接到运行在我的虚拟机上的glassfish服务器! - Cuga
我添加了一些额外的设置:-Dcom.sun.management.jmxremote.local.only=false - Alexey Simonov

3
我最终设置了以下选项,以确保使用Glassfish的JMX对防火墙友好:
<jvm-options>-Dcom.sun.aas.jconsole.server.cbport=XXXX</jvm-options>

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

这篇博客文章中了解更多。请注意,此功能需要更新版本的Glassfish。我已成功地在Glassfish 2.1.1上使用它。


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

为了确保:第一步 - 是否涉及从JVM选项中删除所有com.sun.management.jmxremote设置? - tronda
这意味着保持它们与开箱即用时相同。如果 JMX 设置存在 - 让它们存在,如果不存在 - 不要添加它们。 - Pavel

0

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

./asadmin enable-secure-admin

还有其他Glassfish服务器配置可进一步启用安全性,请参见通过JMX远程连接到Glassfish了解更多信息。

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

** 另一个注意事项,仅使用JVM选项设置,Glassfish将无法启动以上运行时异常。 ** 我正在使用GF3.1.2及以上版本和Java 7。


0

不是这样的。而且我正在使用 GF v2.1 (9.1.1) (build b60e-fcs)。 - Pavel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接