Проблемы с подключением к замыканию 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
               ...
               ...
               ...
               ))

Отлично работает.

Другие вопросы по тегам