любое простое решение для использования асинхронного ядра clojure с кольцом (адаптер vertx/ring)

что может быть лучшим способом обработки асинхронных каналов в кольце, в основном мне нужно получить ответ моего канала внутри моего обработчика, а затем обслужить ответ

(GET "/slow/:a" [a] (slow-request2 a))

;;this function do a slow operation simulating a slow request
(defn slow-response [a]
  (let [ch (!/chan 1)]
    (!/go (Thread/sleep 10000)
          (print "running slow")
          (!/>! ch (+ 1 a)))
    ch))

;;based in the recommendation from http://www.reddit.com/r/Clojure/comments/2ka3na/how_do_you_organize_your_coreasync_code/cljbz2q


(defn slow-request [a]
  (!/go-loop
    [v (!/<! (slow-response a))]
    (when v (do
              (print "response v")
              {:status 200 :body v}))))

(defn slow-request2 [a]
  (!/go
    (while true
      {:status 200 :body (!/<! (slow-response a))})))

к сожалению, я получаю эту ошибку

java.lang.IllegalArgumentException в /slow/10

Нет реализации метода: :рендеринг протокола: #'compojure.response/Renderable найден для класса: clojure.core.async.impl.channels.ManyToManyChannel

кажется, что обработчик пытается ответить на весь блок go вместо моего тела запроса, я не могу найти решение для обработки ответа без побочных эффектов, кроме как использовать блокирующий ответ

что может быть лучшим подходом в этом случае?

примечание: я использую адаптер vertx/ring, поэтому http/kit сейчас не вариант, мне нужно найти способ обработки каналов в кольцевом ответе


person user1050817    schedule 25.03.2015    source источник
comment
Изменит ли добавление вершины к заголовку вопроса его значение для вас?   -  person Arthur Ulfeldt    schedule 25.03.2015


Ответы (1)


Вам нужно сделать блокировку канала core.async, чтобы принудительно установить значение. В противном случае обработчик вернет сам канал, а не значение канала.

Если вам нужна поддержка асинхронности в ваших запросах, рассмотрите возможность использования Pedestal.

Кроме того, предпочтите тайм-аут чан, а не Thread/sleep, когда внутри блоков go.

person gvickers    schedule 26.03.2015
comment
Видеть? Никто не получает этот вопрос, потому что он просто задан неправильно. Мой (теперь удаленный) ответ был почти таким же, как этот. - person Leon Grapenthin; 26.03.2015
comment
@LeonGrapenthin, а почему ты удалил свой ответ? .. Я нашел эти библиотеки github.com/dgrnbrg/spiral github.com/ninjudd/ring-async возможно, спираль будет адаптирована к вертексу, но требуют усилий и понимания, чем у меня нет, сейчас я тестирую пьедестал, следуя предложению гвиккерса.. - person user1050817; 01.04.2015