https://github.com/clojure/java.jmx是否等同于使用JVM启动选项(如-Dcom.sun.management.jmxremote
...)?
我们是否可以在生产中为其他(非clojure)监控工具公开JMX端口?
或者只是clojure-to-clojure?
目标是在Clojure中执行此操作,而不是依赖系统启动脚本来执行此操作,这使得在我的情况下更容易配置/测试。
答案 0 :(得分:2)
这一切都取决于你想要什么以及为什么要问,更多的上下文可能适用:你想从Clojure流程监控,还是想监控Clojure流程?您有哪两个进程可以控制作者?
JMX客户端
clojure.java.jmx
是一个客户端库,可以在本地或通过线路(JMX over RMI)从Clojure调用Java JMX函数。它基本上是GUI的编程替代品,如JVisualVM / JMC。
JMX服务器
通过RMI
虽然您始终可以在Java进程本身内使用JMX调用,但为了能够远程监视Java / Clojure进程,您仍需要包含-Dcom.sun.management.jmxremote
参数。这使得该进程充当通过RMI连接的JMX请求的服务器。
通过HTTP
RMI的替代方案是通过jolokia通过REST接口为JMX提供服务。众所周知,RMI很难通过防火墙等网络基础设施边界进行管理,并通过身份验证和授权来保护。
基于REST的JMX更易于管理(JMX URL的反向代理排除)。身份验证和授权也可以在当前的Web堆栈中完成。
虽然这些REST调用没有Clojure客户端,但是应该很容易镜像clojure.java.jmx API并让它生成HTTP请求。
公开JMX bean
如果您有一个需要公开可通过JMX读取的特定于应用程序的指标的Clojure应用程序,则需要将其转换为JMX MBean。您可以将任何clojure map ref包装在bean中,并且可以通过JMX请求查看对该ref的任何更新。
clojure.java.jmx
也可以提供帮助。
(def my-statistics
(ref {:current-sessions 0}))
(jmx/register-mbean
(jmx/create-bean my-statistics)
"my.namespace:name=Sessions")
(defn login
[user]
;(do-login user)
(dosync (alter my-statistics update :current-sessions inc)))
(login "foo")
;just as an example to show you can read the bean through JMX
(jmx/attribute-names "my.namespace:name=Sessions")
=> (:current-sessions)
(jmx/read "my.namespace:name=Sessions" :current-sessions)
=> 1
确保ref map具有字符串/符号键和Java'原始'值,或者您可能在客户端获得读取异常。
如果您已设置连接到流程的方法,则可以通过JMX请求来自此bean的数据。