Почему HTTP-сервер Алефа ничего не делает?
Я написал относительно простой HTTP-сервер, используя библиотеку Clojure 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 или что-то подобное. Что мне здесь не хватает? Ясно, что для запуска сервера в Алефе мне нужно что-то еще.
2 ответа
Вы захотите вызвать aleph.netty/wait-for-close для значения, возвращаемого start-server, чтобы заблокировать его до закрытия сервера.
http/start-server не блокирует, он просто возвращает объект, так что больше нечего делать, выполнение -main завершается, и программа завершается.
Я не использую aleph и не вижу явного паттерна, похожего на соединение. Похоже, что нужно выполнить собственное управление жизненным циклом, а затем вызвать.close для объекта, возвращаемого из start-server, чтобы корректно завершить работу.