2013-04-19 12 views
11

Ho appena iniziato lo sviluppo di un servizio in Clojure. Sono un po 'perso nel modo di affrontare l'arresto del server.Il modo migliore per incorporare NREPL nel server Clojure

Sto usando Clojure 1.5.1. Per la registrazione, sto usando Timbre 1.5.3. Voglio incorporare NREPL nel mio server per la distribuzione di hot code.

Questo è il mio file core.clj. Il core è il mio principale e sto usando la shell dell'app che genera "lein new app".

(ns extenium.core 
    (:require [taoensso.timbre :as t] 
      [clojure.tools.nrepl.server :as nrs]) 
    (:gen-class)) 

(def nrepl-server) 

(defn start-nrepl-server [] 
    (t/info "Starting nrepl server on port 8628") 
    (alter-var-root #'nrepl-server 
        (constantly 
        (nrs/start-server :port 8628))) 
    (t/info "Started nrepl server")) 

(defn stop-nrepl-server [] 
    (t/info "Stopping nrepl server") 
    (nrs/stop-server nrepl-server) 
    (t/info "Stopped nrepl server")) 

(defn start [] 
    (alter-var-root #'*read-eval* 
        (constantly 
        false)) 
    (start-nrepl-server)) 

(defn stop [] 
    (stop-nrepl-server)) 

(defn -main [& args] 
    (start)) 

Quando ho "run Lein" il nrepl-server viene avviato come previsto, con messaggi info vanno al Terminal. Quindi mi collego con "nrepl" di Emacs. Nessun problema. Da Emacs eseguo "(extenium.core/stop)". A quel punto, ricevo il messaggio "Arresto del server nrepl" su Emacs (il che significa che lo stdout è stato reindirizzato al client). La connessione si chiude (come previsto) e non vedo mai il messaggio "Arresto del server nrepl". Belle.

Guardo il terminale e non vedo i messaggi "Arresto ..." o "Interrotto ...". Invece, ottengo la seguente eccezione:

Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed 

Idealmente, voglio il seguente:

  1. Per essere in grado di avviare l'arresto da un client NREPL. Chiudi con garbo tutte le connessioni client NREPL senza eccezioni. Arresto con i messaggi di registrazione diretti verso il Terminale (o eventualmente un file di registro rotante).
  2. Per la durata della connessione NREPL, clonare l'output di registrazione sul server (Terminal o registro) e sull'uscita NREPL.
  3. Acquisire informazioni sulle connessioni NREPL in ingresso, denominarle e registrare la connessione e disconnettere l'attività.
  4. Eventualmente, autenticare le connessioni NREPL in entrata.
  5. Anche dopo, autorizzarli per le azioni che eseguono.

risposta

2

Disclaimer: Non l'ho fatto, ma sembra interessante.

Per il README, in particolare la sezione "Perché nREPL?" dovresti essere in grado di implementare 2 - 4 implementando il tuo trasporto personalizzato, magari semplicemente estendendo uno di quelli già pronti per l'uso.

Arrestare il server con garbo può comportare l'estensione del trasporto socket. Quello che stai descrivendo come "graceful shutdown" suona come l'implementazione di un protocollo "Logout".

Autorizzare le azioni che eseguono sembra meno semplice. Sembra che tu debba implementare un gestore personalizzato, magari avvolgendo di nuovo lo default-handler con il codice di autorizzazione.

Buona fortuna!

Problemi correlati