2016-08-02 2 views
0

Я пытаюсь вызвать несколько удаленных операций JMX, используя то же соединение из clojure. Я использую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*) 
) 

Calling

 (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' –

Смежные вопросы