Java 如何在远程Glassfish服务器上激活JMX,以便使用jconsole进行访问?
我想监控远程glassfish服务器。我已在domain.xml中启用JMX连接:Java 如何在远程Glassfish服务器上激活JMX,以便使用jconsole进行访问?,java,glassfish,jmx,jconsole,Java,Glassfish,Jmx,Jconsole,我想监控远程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连接到服务器。然后我找
<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>
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8686
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
但现在,当我启动服务器时,会出现以下错误:
无法加载日志管理器
“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(本机
(方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:188)
位于java.lang.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(本机
(方法)
位于java.util.logging.LogManager。(LogManager.java:156)
位于java.util.logging.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:
未能加载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)
位于sun.management.ManagementFactory.createPlatformMBeanServer(ManagementFactory.java:302)
位于java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:504)
在sun.management.jmxremote.ConnectorBootstrap.initialize(ConnectorBootstrap.java:392)中
位于sun.management.Agent.startAgent(Agent.java:127)
位于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(本机
(方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:188)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:307)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
位于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
我怎样才能解决这个问题
提前感谢。不是吗?解决问题的步骤如下: 1.使用默认设置
2.在GlassFish实例的JVM选项中添加-Djava.rmi.server.hostname=。我最后设置了以下选项,以确保使用GlassFish的JMX对防火墙友好:
<jvm-options>-Dcom.sun.aas.jconsole.server.cbport=XXXX</jvm-options>
-Dcom.sun.aas.jconsole.server.cbport=XXXX
其中XXXX是防火墙中使用的端口号,以及应用服务器配置的JMX端口号(通常为8686)
阅读更多信息。请注意,此功能需要更新版本的Glassfish。我已经成功地将它用于Glassfish 2.1.1。仍然是神秘的行为,但是通过这4个设置,您可以连接到运行Glassfish的JVM(在管理控制台中添加到domain.xml,需要重新启动) 当心!这是不安全的,因为现在任何人都可以将jconsole连接到它 在我看来,这不是Glassfish的方式,它使用的是JMX连接器
(以上在GF 3.1中适用)如果在Glassfish应用程序服务器中运行应用程序,只需运行以下asadmin命令,您需要重新启动所有正在运行的服务器,更改才能生效 /asadmin启用安全管理 有额外的Glassfish服务器配置来进一步启用安全性,请参阅 您确实需要遵循JVM选项的步骤,这些是Java应用程序的一般说明。对于使用Glassfish应用服务器运行的Java应用程序,只需使用asadm命令。这节省了我很多时间 **另一个注意事项是,只有使用JVM选项的设置,Glassfish将无法启动上述运行时异常。
**我使用的是GF3.1.2及以上版本和Java 7。不,不是。此外,我正在使用GF v2.1(9.1.1)(构建b60e fcs)只是为了确保:第一步——做到了吗
-Djava.rmi.server.hostname=yourhost
-Dcom.sun.management.jmxremote.port=8686
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false