现在,我需要在clojure/java混合系统中重新加载一些代码。更新在线程中运行的clojure代码
我知道tools.namespace lib可以用来刷新clj代码。但是当我尝试重新加载线程中使用的代码时,它不会更新。
这是示例的Clojure代码我需要更新:(只是上壳体和下壳体之间切换。)
(ns com.test.test-util)
(defn get-word [sentence]
(let [a-word (rand-nth (clojure.string/split sentence #"\s"))
;;a-word (clojure.string/upper-case a-word)
]
(println a-word)
a-word))
我使用的将来启动一个线程并调用上述代码。
在主要方法中,在我的第一个测试中,我创建了一个未来并在一段时间后刷新了代码。但它没有更新。所以,我还测试了刷新后创建另一个线程。但代码没有更新。
(defn start-job []
(future (
(println "start worker job.")
(while @job-cond
(do (get-word (rand-nth sentences))
(Thread/sleep 2000)))
(println "return!")
)))
(defn -main []
(let [work-job (start-job)]
(println "modify clj file...")
(Thread/sleep 10000)
(swap! job-cond not)
(future-cancel work-job)
(swap! job-cond not)
(refresh)
(Thread/sleep 3000)
(let [new-work-job (start-job)]
(Thread/sleep 10000)
(swap! job-cond not)
(future-cancel new-work-job))))
谢谢。
您有多余的括号可保证在开始作业定义中导致NPE。不带引号的括号不会将代码块分组到clojure中,它们会调用函数或宏调用。未来有一个隐含的do块,所以你不需要在未来包装代码块。同时块中的do也是不需要的,因为while也有一个隐含的do。 – noisesmith