2016-08-02 30 views
0

Ich versuche, eine Reihe von Remote-JMX-Operationen mit der gleichen Verbindung von Clojure aufrufen. Ich verwendeclojure/jmx with-connection löscht Verbindung

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

Allerdings finde ich, dass die Verbindung eifrig mit einer lokalen JMX-Verbindung ersetzt wird. Zur Veranschaulichung:

gegeben:

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

Wenn ich etwas wie:

(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*) 
) 

Aufruf

 (caller [1] "host" 8000) 

ich:

#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]] 

Die Remoteverbindung dauert also nur für die erste Anweisung, die auf die Verbindung zugreift, bevor sie auf den lokalen Server zurückgesetzt wird. Wie behalte ich die Remote-Verbindung?

Antwort

3

versuchen, (map called col) mit (run! called col) zu ersetzen, und ich wette, es würde funktionieren. Dies hängt mit der Faulheit der Clojure-Sammlungen zusammen: Wenn Sie map aufrufen, kehrt es sofort zurück, ohne Elemente zu realisieren, und wenn es um die Realisierung der Elemente geht, ist der Fluss bereits außerhalb von with-connection Block, was bedeutet, dass die Funktion called aufgerufen wird Kontext, in dem die Verbindung bereits geschlossen ist.

+1

wenn lauf! existiert nicht, weil Sie eine ältere Version von clojure in eine 'Dorun' einbinden –