根据 java.jmx 文档
-------------------------
clojure.java.jmx/with-connection
([opts & body])
宏
使用基于 opts 构建的 JMX 连接执行 body。opts 可以包括 [默认]
:protocol 要使用的协议 [rmi:///jndi/rmi]
:host 连接到的主机 [localhost]
:port 连接到的端口 [3000]
:jndi-path 要使用的 jndi-path [jmxuri]
:url 要使用的完整 URL(作为字符串)
而不是从上述选项生成 rmi URL [nil]
:environment A map representing the environment used for the connection.
See JMXConnectorFactory/connect for details [{}]
描述表明 :url 默认为 'nil',如果不为 nil,则将使用上述选项。
然而,如果我叫用函数时 :url 为 nil 和其他选项,它仍然会使用 nil URL,并忽略其他选项。
=> (jmx/with-connection {:url nil :host "localhost"} (jmx/mbean-names "*:*"))
NullPointerException javax.management.remote.JMXServiceURL.<init> (JMXServiceURL.java:142)
=> (jmx/with-connection {:host "localhost"} (jmx/mbean-names "*:*"))
ConnectException 连接被拒绝 (连接被拒绝) java.net.PlainSocketImpl.socketConnect (PlainSocketImpl.java:-2)
我检查了代码
...
(JMXServiceURL. (:url opts# (jmx-url opts#)))
...
我相信这里的意图是在没有 :url 键或 :url 为 nil 时回退到 (jmx-url opts#)(如文档所述)
但实际行为并没有回退,如果 opts# 包含 :url => nil。
=> (:url {:url nil :foo "bar"} "fallback")
nil
=> (:url {:foo "bar"} "fallback")
"fallback"