2016-08-02 54 views
0

我想從clojure使用相同的連接調用一些遠程JMX操作。我正在使用clojure/jmx with-connection失去連接

[org.clojure/java.jmx "0.3.3"] 

但是我發現連接急切地被本地JMX連接所取代。作爲一個例證:

給出:

(ns test.core 
    (:require 
    [clojure.java.jmx :as jmx])) 

如果我有這樣的:

(defn caller [col host port] 
    (println jmx/*connection*) 
    (jmx/with-connection {:host host, :port port :environment 
         {"jmx.remote.credentials" (into-array String ["tomcat" "tomcat"])}} 
    (do 
    (println jmx/*connection*) 
    (map called col)))) 

(defn called [line] 
    (println jmx/*connection*) 
) 

調用

 (caller [1] "host" 8000) 

我得到:

#object[com.sun.jmx.mbeanserver.JmxMBeanServer 0x2c914364 [email protected]] 
#object[javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection 0x2b4bbf01 javax[email protected]2b4bbf01] 
#object[com.sun.jmx.mbeanserver.JmxMBeanServer 0x2c914364 [email protected]] 

因此,遠程連接只能在第一條語句訪問連接之前持續到本地服務器。我如何保持遠程連接?

回答

3

嘗試更換(map called col)(run! called col),我敢打賭它會工作。這與clojure的集合懶惰有關:當你調用map時,它立即返回,沒有意識到元素,當涉及元素的實現時,流程已經不在with-connection區塊中,這意味着函數called被調用上下文連接已經關閉。

+1

如果運行!不存在,因爲你使用舊版本的clojure將它包裝在'dorun'中 –