According to the java.jmx doc:
-------------------------
clojure.java.jmx/with-connection
([opts & body])
Macro
Execute body with a JMX connection created based on opts. opts can include [default]:
:protocol The protocol to use [rmi:///jndi/rmi]
:host The host to connect to [localhost]
:port The port to connect to [3000]
:jndi-path The jndi-path to use [jmxuri]
:url The full url (as a String) to use instead of generating a rmi url from
the above options [nil]
:environment A map representing the environment used for the connection.
See JMXConnectorFactory/connect for details [{}]
The description indicates :url is by default 'nil', and when it is not, it will be used instead of options above.
However, if I called the function with :url=nil and other options, it will use the nil url anyway, and ignore other options.
=> (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 Connection refused (Connection refused) java.net.PlainSocketImpl.socketConnect (PlainSocketImpl.java:-2)
I checked the code:
...
(JMXServiceURL. (:url opts# (jmx-url opts#)))
...
I believe the intention here is to fallback to (jmx-url opts#) when either there's no :url key or :url is nil (as said in doc also)
But the actual behavior is not falling back, if opts# contains :url => nil.
=> (:url {:url nil :foo "bar"} "fallback")
nil
=> (:url {:foo "bar"} "fallback")
"fallback"