根据 java.jmx 文档
-------------------------
clojure.java.jmx/with-connection
([opts & body])
宏
使用基于 opts 创建的 JMX 连接执行 body。opts 可以包含 [default]
:protocol 要使用的协议 [rmi:///jndi/rmi]
:host 要连接到的主机 [localhost]
:port 要连接到的端口号 [3000]
:jndi-path 要使用的 jndi-path [jmxuri]
:url 要使用的完整 URL(作为字符串),而不是使用上述选项生成 rmi URL [nil]
使用上述选项而不是生成 rmi URL [nil]
:environment 代 表连接所使用的环境的映射。
有关详细信息,请参阅 JMXConnectorFactory/connect [{}]
描述表明 :url 默认为 '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 "*:*"))
连接异常 连接被拒绝 (连接被拒绝) 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"