2016-09-14 3 views
5

Я написал относительно простой HTTP-сервер, используя библиотеку Clojure Aleph. Это не очень сложно:Почему HTTP-сервер Aleph не делает ничего?

(ns cxpond.xmlrpc.core 
    (:gen-class) 
    (:require [aleph.http :as http])) 

(defn handler [req] 
    {:status 200 
    :headers {"Content-Type" "text/plain"} 
    :body "HELLO, WORLD!"}) 

(defn -main [& args] 
    (http/start-server service/handler {:port 8005})) 

Очевидно, что это довольно просто, и следует пример, приведенный в док Алеф довольно близко. Он компилируется нормально, но когда я запускаю его (через lein run), он просто ... ничего не делает. Программа сразу завершается; очевидно, что он не слушает порт 8005 или что-то в этом роде. Что мне здесь не хватает? Очевидно, должно быть что-то еще, что мне нужно сделать, чтобы запустить сервер в Алефе.

+1

Вы посмотрели на Кольцо? Существует хорошее введение в Интернете по адресу: https://github.com/clojure-cookbook/clojure-cookbook/blob/master/07_webapps/7-00_introduction.asciidoc. Очень приятная печатная версия книги (O'Reilly) также доступно: http://clojure-cookbook.com/ –

+0

Я также очень впечатлен книгой Веб-разработка с Clojure: https://pragprog.com/book/dswdcloj2/web-development-with-clojure-second-edition –

+0

@AlanThompson: Спасибо! Я не думал смотреть на кольцо, но я думаю, что это может сделать работу здесь красиво. – mipadi

ответ

5

http/start-server не блокирует, просто возвращает объект, поэтому больше ничего не нужно делать - основные окончания и программа заканчивается.

Я не использую aleph и не вижу очевидного шаблона объединения. Кажется, что нужно сделать собственное управление жизненным циклом, а затем вызвать .close на объект, возвращенный из start-сервера, чтобы изящно закрыть.

10

Вы хотите вызвать «aleph.netty/wait-for-close» на значение, возвращаемое «start-server», чтобы заблокировать, пока сервер не будет закрыт.

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