पूरे जेवीएम को पुनरारंभ किए बिना उत्पादन कोड को नए कोड को धक्का देने का सबसे अच्छा तरीका क्या है?उत्पादन रिंग-क्लोजर सर्वर पर कोड लोड करना
वर्तमान में मैं उत्पादन में रैप-रीलोड का उपयोग करता हूं, लेकिन यह मेरे लिए काफी काम नहीं करता है क्योंकि कभी-कभी मैं नए कोड के साथ रिंग शुरू करने के अनुरोध से पहले प्रतिलिपि (उदाहरण के लिए डेटाबेस माइग्रेशन कर रहा हूं) में कमांड चलाने के लिए चाहता हूं। इसके अलावा विभिन्न ब्लॉग और ट्यूटोरियल भी उत्पादन में रैप-रीलोड का उपयोग नहीं करते हैं, हालांकि मुझे समझ में नहीं आता कि क्यों नहीं।
मैं निम्नलिखित समाधान के साथ आया हूं, लेकिन मैं कबूल करता हूं कि मुझे हुड के नीचे क्या हो रहा है इसकी गहरी समझ नहीं है। मैं सोच रहा था कि क्या मैं किसी ऐसे व्यक्ति द्वारा स्वच्छता जांच प्राप्त कर सकता हूं जो करता है। क्या यह तकनीक उचित प्रतीत होती है?
विचार एक पथ (/ 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))
स्पष्टीकरण के लिए धन्यवाद, जो चीजों को साफ़ करता है! –