2012-05-31 1 views
2

Я экспериментирую с использованием noir для запуска трех серверов (каждый из которых обрабатывает другой аспект приложения). Я пытаюсь сделать это, чтобы я мог запускать все три сервера в одном приложении при разработке и легко отделить проект от трех разных приложений для развертывания.load-views при запуске нескольких noir-серверов

Не стоит использовать noir.server/start и noir.server/stop для управления серверами причала. Мне нужно.

То, что я пытаюсь выяснить, это способ вызвать load-views (или что-то в этом роде) с различными представлениями для каждого сервера, чтобы конфликты URI обрабатывались с помощью правильного defpage.

ответ

1

Я нашел решение, которое работает, очищая noir.core/noir-routes, noir.core/route-funcs, noir.core/pre-routes и noir.core/post-routes. У меня есть пример ниже пространства имен, который запускает три сервера, все с их собственными представлениями.

(ns my-three.server 
    (:require 
    [noir.core :as noir] 
    [noir.server :as server])) 

(def ^:dynamic *servers* (atom {})) 

(defn clear-routes [] 
    (do 
    (reset! noir/noir-routes {}) 
    (reset! noir/route-funcs {}) 
    (reset! noir/pre-routes (sorted-map)) 
    (reset! noir/post-routes []) 
    nil)) 

(defn start-server [port mode] 
    (if-let [s (@*servers* port)] 
    (println "Server already running on port" port) 
    (swap! *servers* assoc port (server/start port {:mode mode})))) 

(defn stop-server [port] 
    (let [s (@*servers* port)] 
    (server/stop s) 
    (swap! *servers* dissoc port))) 

(defn stop-all [] 
    (doall (map stop-server (keys @*servers*)))) 


(defn -main [& m] 
    (let [mode (if (nil? (first m)) :prod (first m))] 
    (server/load-views "src/my_three/views/web/") 
    (start-server 8080 mode) 
    (clear-routes) 
    (server/load-views "src/my_three/views/mobile_downstream/") 
    (start-server 8081 mode) 
    (clear-routes) 
    (server/load-views "src/my_three/views/mobile_upstream/") 
    (start-server 8082 mode)))