전체 JVM을 다시 시작하지 않고 프로덕션 링 서버로 새 코드를 푸시하는 가장 좋은 방법은 무엇입니까?프로덕션 링 - 클로저 서버에서 코드 다시 로딩
현재 프로덕션에서는 wrap-reload를 사용합니다. 그러나 링이 새로운 코드로 요청을 처리하기 전에 repl (예 : 데이터베이스 마이그레이션)에서 명령을 실행하려고하기 때문에 이것은 나에게 적합하지 않습니다. 또한 다양한 블로그와 튜토리얼은 생산에 wrap-reload를 사용하지 않는다고 설명합니다.
나는 다음과 같은 해결책을 생각해 냈지만, 나는 두포에서 무슨 일이 벌어지고 있는지 깊이 이해하지 못했다고 고백한다. 나는 누군가가 정신 건강 검사를받을 수 있는지 궁금해하고있었습니다. 이 기술이 합리적인 것처럼 보이나요?
아이디어는 모든 clojure 코드가 다시로드되도록하는 경로 (/ admin/reload-clj)를 갖는 것입니다.
(defonce ^:dynamic *jetty*)
(declare reload-clj)
(defn app [req]
...
(when (= (req :uri) "/admin/reload-clj") (reload-clj req))
...)
(defn start-jetty []
(let [j (run-jetty app {:port (http-port) :join? false :max-threads 16})]
(dosync (ref-set *jetty* j))
j))
(defn reload-clj [req]
(future
(log/info "Reloading clojure code...")
(require '(whrusrv admin main utils wdb) :reload-all)
(.stop @*jetty*)
(start-jetty)
(log/info "Clojure reload success!"))
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Reloading..."})
(defn -main [& args]
(start-jetty))
설명을 주셔서 감사합니다. –