2010-04-24 8 views
52

Estoy escribiendo una aplicación web usando ring y clojure. Estoy usando el adaptador de muelle para el servidor de desarrollo y emacs/SLIME para IDE. Si bien la función de recapitulación ayuda, el run-jetty bloquea mi sesión de limo y me gustaría poder iniciar/detenerlo a voluntad sin tener que ejecutarlo en una sesión de terminal separada. Idealmente, me gustaría definir un agente de servidor y funciones start-server y stop-server que iniciarían/​​detendrían el servidor dentro del agente. es posible?¿Cómo dejo el servidor de embarcadero en clojure?

Respuesta

97

por lo general tienen una línea en mi aplicación anillo que tiene el siguiente aspecto:

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

Esto evita el bloqueo hasta el REPL. También me permite recompilar este archivo sin preocuparme de que mi servidor sea redefinido. También le permite interactuar en el REPL así:

user=> (.stop server) 

y

user=> (.start server) 
+0

¡Exactamente lo que estaba buscando! –

+0

Recibo este error: 'No se ha encontrado ningún campo coincidente: comienzo de la clase clojure.lang.PersistentList [Clase lanzada java.lang.IllegalArgumentException]'. ¿Algunas ideas? – Tyler

+3

No importa, el problema era que la definición no se estaba redefiniendo - imagine eso :) – Tyler

1

La documentación del Jetty tiene alguna información sobre graceful shutdown de Jetty. Probablemente no sea suficiente información, pero puede ayudarlo a comenzar.

No he empezado a jugar con compojure todavía, pero en general prefiero trabajar con Tomcat. Es más completo; entre otras cosas, hay una API bien documentada para iniciar y cerrar, escucha el comando de apagado en un puerto dedicado; hay ant tareas para hacer esto y, por supuesto, también se pueden llamar desde una aplicación Java. Simplemente no sé qué clase de magia hace Compojure al conectar el REPL a una instancia en ejecución del contenedor Web, y si/cómo se produce la recarga automática de clases ... con suerte alguien más podrá proporcionar más información.

+0

Bueno, en este caso, ni siquiera estoy usando compojure, sólo estoy usando ring.jetty.adapter para iniciar embarcadero servidor. La razón para ir con Jetty es que no tengo que volver a compilar todo el tiempo. –

+1

Guau, ¿Jetty te permite hacer eso? Guay. Tendrá que aprender sobre eso pronto-ish. ¡Gracias! –

Cuestiones relacionadas