![]() |
1
38
这个 documentation 建议JMX代理使用 地方的 端口--从计算机外部无法访问的内容--除非指定以下属性:
这是出于安全考虑,也是因为土豆头先生给出的理由。因此,看起来Java 6没有打开默认值。 远程访问 JMX的端口。 编辑:在OP添加包含更多信息的答案后添加。 另一个选择是以某种方式创建一个本地代理,它监听所有本地JMX连接并导出这些信息。这样,您就不需要对服务器上的每个JVM实例进行这种神奇的配置。相反,本地代理可以通过JMX连接到所有JVM,然后以某种方式远程公开这些信息。我不是很肯定您将如何实现这一点,但是像这样的事情可能比您通过JMX远程公开所有JVM所必须做的工作要少。 |
![]() |
2
87
嗯, 以下是连接 JMX客户端进程 (A) 管理应用程序 像jconsole、jmxterm、mc4j、jvmstat、jmxmonitor、jps等)到 JMX服务器进程 (the 代理人 ) 连接JMX客户端和JMX服务器的协议被假定为“Java RMI”(AKA’RMI-JRMP’)。这应该是默认设置。一个人可以配置 other protocols 尤其是“RMI-IIOP”和“JMXMP”。可以使用特殊协议: MX4J 例如,Project还通过HTTP提供SOAP/HTTP和各种序列化协议。 参照 Sun/Oracle docs 有关配置的详细信息。
还要看一下文件
所以,可能性是: 案例0:JVM在没有任何特定配置的情况下启动 在Java 6之前:JVM不作为JMX服务器来运行。在JVM内部运行的任何程序都可以访问JVM的 MBeanServer 以编程方式进行,并使用它在线程之间进行有趣的数据交换或进行JVM监视,但不可能从JVM进程外部进行管理。 由于Java 6:即使不显式配置,也可以访问JVM的JMX功能。 局部地 (来自同一台机器)如“案例1”所述。
案例1:JVM是以
JVM被配置为 地方的 (仅限同一台计算机)JMX服务器。
在这种情况下(原则上仅适用于Sun/Oracle JVM),JMX客户机可以通过中的内存映射文件连接到JMX服务器。
Sun建议跑步
但是,本地监控相当安全,只在本地可用,并且可以通过文件系统权限轻松控制。
案例2:JMX服务器是以
JVM被配置为作为一个JMX服务器在多个TCP端口上侦听。 命令行上指定的端口将由JVM分配,并且在那里将提供一个RMI注册表。注册表公布名为“jmxrmi”的连接器。它指向第二个随机分配的TCP端口(一个“临时”端口),JMX RMI服务器在该端口上侦听,并通过该端口进行实际数据交换。 “情况1”中所述的本地总是在“情况2”中启用。 JMX服务器默认监听所有接口,因此您可以通过本地连接到127.0.0.1:[rmiRegistryPort]以及远程连接到[任何外部IP地址]:[某些端口]来连接到它(并控制它)。
这意味着您必须考虑安全问题
. 只能通过设置使jvm侦听127.0.0.1:[rmiRegistryPort]
不幸的是,我们不能指定临时端口的分配位置——它总是在启动时随机选择。这很可能意味着你的防火墙需要成为该死的瑞士奶酪!但是,有 workarounds . 尤其是,ApacheTomcat通过其 JMX Remote Lifecycle Listener . 执行这个小魔术的代码可以在 org.apache.catalina.mbeans.JmxRemoteLifecycleListener . 如果使用此方法,还可以确保:
如何做到这一点在 the Sun/Oracle documentation 其他方法
您可以进行有趣的排列以避免使用RMI协议。特别是,您可以将servlet引擎(如jetty)添加到您的流程中。然后添加servlet,将一些基于HTTP的交换内部转换为对JVM的直接访问
更离题的是,根据 this document . 显示和显示时间 现在是时候用一些代码来说明JXM交换了。我们的灵感来自 a Sunoracle tutorial . 这在Unix上运行。我们使用配置为JMX服务器的JVM,使用:
我们使用
您应该看到这样的内容:注册表端口和临时端口:
我们使用
我们建立了一个文件
然后我们可以运行这个,看看会发生什么:
|
![]() |
3
6
实际上,有一个未记录的属性可以用于强制JMX在随机端口号上创建可远程访问的连接器。
最后两个属性是最重要的。 |
![]() |
4
3
这个 documentation 似乎表明JMX代理使用本地临时端口, 除非 指定以下属性:
默认端口被避免,因为您可以 许多的 Java应用程序在一个系统上,如果有缺省端口,只有一个应用程序能够被管理!上面的配置属性是为 明确目的 属于 遥远的 管理。 如果您必须坚持使用临时端口,那么JMX代理的URL应该可以通过以下系统属性从JVM中访问(尽管这可能是本地地址):
注释 :我想您总是可以在远程可用地址上打开一个套接字,在本地套接字上打开代理请求,但是使用可用选项似乎更有吸引力! |
![]() |
5
2
所以,我问题的简短答案是“不”。
然而,研究原因是很有趣的。看看
但是,尝试连接还不够
因此,我的故事的结论是,如果我们将促进使用JMX对客户进行远程监控,我们确实需要为我们系统中启动的各种Java进程识别唯一的单个远程访问端口。幸运的是,所有这些都需要明智地使用vm参数:
我们几乎肯定会有一个预先指定的连续范围
|
![]() |
6
2
我最近一直在研究如何从Java代码中启用远程JMX管理,而不需要JVM以特殊的属性集启动。我解决的解决方案是启动我自己的私有RMI注册表——足够简单——并在该注册表上公开JMX服务。我创建自己的MBeanServer,然后创建一个新的JMxConnectorServer。jmxConnectorServer是通过如下调用创建的
其中server是MBeanServer,url是jmxServiceURL的实例。 URL的格式为“service:jmx:rmi:///jndi/rmi://localhost:/jmx rmi”,其中port是(本地)私有注册表的端口号。jmxrmi“是jmx服务的标准服务名。 在设置好这个接口并启动连接器之后,我发现可以使用hostname:port从jconsole连接到它。 这完全满足了我的需要;我有兴趣知道是否有人看到这种方法的缺陷。 参考文献: JMX Tutorial, Chap. 3 |
![]() |
7
0
如果您碰巧在glassfish app server中运行应用程序,只需运行以下asadmin命令,就需要重新启动所有正在运行的服务器,更改才会生效。 /asadmin启用安全管理 有额外的glassfish服务器配置来进一步启用安全性,请参阅 Connecting remotely to Glassfish through JMX . |
|
user29759326 · 如何返回递归函数中的最后一个值? 5 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 5 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 5 月前 |
![]() |
rudraraj · java中未声明最终变量 6 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 6 月前 |