运行多个noir服务器时的加载视图

时间:2012-05-31 17:58:28

标签: clojure compojure ring noir

我正在尝试使用noir启动三个服务器(每个服务器处理应用程序的不同方面)。我正在尝试这样做,以便我可以在一个应用程序中运行所有三个服务器,同时开发并轻松地将项目拆分为三个不同的应用程序进行部署。

使用noir.server/startnoir.server/stop来运行我需要的码头服务器是没有问题的。

我想弄清楚的是用某种方法调用load-views(或类似的东西),为每个服务器设置不同的设置视图,以便正确的defpage处理URI冲突。

1 个答案:

答案 0 :(得分:1)

我找到了一个可以清除noir.core/noir-routesnoir.core/route-funcsnoir.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)))