2012-05-31 6 views
2

나는 3 개의 서버를 시작하기 위해 noir을 사용하여 실험하고있다. 한 가지 애플리케이션 내에서 세 개의 서버를 모두 실행할 수 있도록 배포를 위해 프로젝트를 세 가지 다른 응용 프로그램으로 쉽게 분리 할 수 ​​있도록이 작업을 수행하려고합니다.여러 개의 noir 서버를 실행할 때로드 뷰

내가 원하는 부티가 서버를 실행하려면 noir.server/startnoir.server/stop을 사용하는 것이 좋습니다.

제가 알아 내려고 시도한 것은 URI 충돌이 올바른 defpage에 의해 처리되도록 각 서버에 대해 다른 설정보기를 사용하여 load-views (또는 이와 비슷한)을 호출하는 방법입니다.

답변

1

noir.core/noir-routes, noir.core/route-funcs, noir.core/pre-routesnoir.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)))