2010-04-24 6 views
52

J'écris une application web en utilisant ring et clojure. J'utilise l'adaptateur jetty pour le serveur de développement et emacs/SLIME pour IDE. Alors que wrap-reload aide, run-jetty bloque ma session slime et j'aimerais pouvoir la démarrer/l'arrêter à volonté sans avoir à l'exécuter dans une session de terminal séparée. Idéalement, je voudrais définir un agent serveur et des fonctions start-server et stop-server qui démarreraient/arrêteraient le serveur dans l'agent. Est-ce possible?Comment arrêter le serveur jetty dans clojure?

Répondre

97

J'ai habituellement une ligne dans mon application Ring qui ressemble à ce qui suit:

(defonce server (run-jetty #'my-app {:port 8080 :join? false})) 

Cela évite le verrouillage REPL. Cela me permet également de recompiler ce fichier sans craindre que mon serveur ne soit redéfini. Il vous permet également d'interagir au REPL comme ceci:

user=> (.stop server) 

et

user=> (.start server) 
+0

Exactement ce que je cherchais! –

+0

Je reçois cette erreur: 'Aucun champ correspondant trouvé: début de la classe clojure.lang.PersistentList [Classe java.lang.IllegalArgumentException]'. Des idées? – Tyler

+3

Peu importe, le problème était que la defonce n'était pas re-defing - imaginez que :) – Tyler

1

La documentation de Jetty contient des informations sur graceful shutdown de Jetty. Ce n'est probablement pas assez d'informations mais cela peut vous aider à démarrer.

Je n'ai pas encore commencé à jouer avec compojure, mais dans l'ensemble je préfère travailler avec Tomcat. C'est plus complet; entre autres choses, il y a une API bien documentée pour le démarrer et l'éteindre, il écoute la commande shutdown sur un port dédié; Il y a des tâches à faire pour cela, et elles peuvent bien sûr être appelées à partir d'une application Java. Je ne sais pas quel genre de magie fait Compojure en connectant le REPL à une instance en cours d'exécution du conteneur Web, et si/comment le rechargement automatique des classes se produit ... j'espère que quelqu'un d'autre pourra fournir plus d'informations.

+0

Eh bien, dans ce cas, je ne suis même pas en utilisant compojure, je suis juste en utilisant ring.jetty.adapter pour commencer la jetée serveur. La raison d'aller avec Jetty est que je n'ai pas à recompiler tout le temps. –

+1

Wow, Jetty vous permet de faire cela? Cool. Devra apprendre à ce sujet bientôt. Merci! –

Questions connexes