Проблемы с подключением к замыканию nREPL с кольцом / композицией
Запуск Leiningen 2.3.4 на Java 1.7.0_21 Java HotSpot(TM) 64-битная виртуальная машина сервера
У меня проблемы с подключением к серверу nREPL.
Я настраиваю новый проект, используя lein new luminus
, а затем добавил зависимость в drawbridge ([com.cemerick/drawbridge "0.0.6"]
).
Я добавил маршрут обработчика для repl следующим образом (на основе https://devcenter.heroku.com/articles/debugging-clojure):
(def drawbridge-handler
(-> (cemerick.drawbridge/ring-handler)
(wrap-keyword-params)
(wrap-nested-params)
(wrap-params)
(wrap-session)))
(defn wrap-drawbridge [handler]
(fn [req]
(if (= "/repl" (:uri req))
(drawbridge-handler req)
(handler req))))
И добавил wrap-drawbridge
к моим промежуточным программам.
Затем я запускаю сервер, используя
lein ring server-headless
Соединение, кажется, работает хорошо, потому что выполнение запроса GET на http:localhost:3000/repl
дает ответ: ["[\n","\n]"]
Но я не могу подключиться к REPL:
> lein repl :connect 0.0.0.0:3000/repl
Connecting to nREPL at 0.0.0.0:3000/repl
И через некоторое время:
SocketException The transport's socket appears to have lost its connection to the nREPL server
clojure.tools.nrepl.transport/bencode/fn--4287/fn--4288 (transport.clj:95)
clojure.tools.nrepl.transport/bencode/fn--4287 (transport.clj:95)
clojure.tools.nrepl.transport/fn-transport/fn--4261 (transport.clj:42)
clojure.core/binding-conveyor-fn/fn--4107 (core.clj:1836)
java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334)
java.util.concurrent.FutureTask.run (FutureTask.java:166)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
java.lang.Thread.run (Thread.java:722)
Bye for now!
Я что-то пропустил?
Редактировать:
Добавил следующий код регистрации в мой обработчик:
(defn wrap-drawbridge [handler]
(fn [req]
(if (= "/repl" (:uri req))
(do (println "IN REPL ")
(drawbridge-handler req))
(handler req))))
При соединении с lein repl :connect http://localhost:3000/repl
как предложено, я вижу строку IN REPL
печатается в бесконечном цикле на консоли сервера.
3 ответа
Не совсем прямой ответ, но я обнаружил, что я не подходил к этой проблеме правильно.
Luminus создает project-name.repl
пространство имен, которое следует использовать для интерактивной разработки.
Я обнаружил, что могу делать то, что хотел, добавив в свой project.clj
:repl-options {
:init-ns project-name.repl
:init (start-server)}
А затем просто запустить сервер с lein repl
,
Гораздо проще, чем настроить промежуточное ПО nREPL!
Вы удостоверились, что на вашем сервере действительно есть запрос (например, с помощью печати)?
Тем не менее, мое первое предположение будет lein repl :connect
ведет себя по-разному в зависимости от того, передаете ли вы ему пару IP / порт или полный URL-адрес. поскольку drawbridge
кажется, делает nREPL доступным через HTTP, я бы посоветовал вам попробовать:
lein repl :connect http://localhost:3000/repl
Вам нужно добавить wrap-drawbridge
на первом месте в вашем списке промежуточного программного обеспечения.
Если вы делаете что-то подобное
(def app (-> #'all-routes
wrap-drawbridge
...
...
...
))
Отлично работает.