我有一个顶级core.async循环。我希望它无限期地运行,至少在我用 CTRL-C 或kill或类似命令停止它之前。我目前正在使用java.lang.Runtime/addShutdownHook,如下所示:
(ns async-demo.core
(:require [clojure.core.async :as async
:refer [<! >! <!! timeout chan alt! go]]))
(defn run [] (go (loop [] (recur))))
(.addShutdownHook (Runtime/getRuntime) (Thread. #(println "SHUTDOWN")))
这是我的问题:
如果我启动 REPL,
(run)
然后它在后台线程中启动并运行。当我退出 REPL 时,我没有看到所需的关闭消息。但是,当我从 运行时
lein run
,go 循环立即退出并显示“SHUTDOWN”。
也不是我想要的。
我不一定期望找到适用于所有 JVM 的解决方案。我在 Mac 上开发并部署到 Ubuntu,所以我想找到一个适用于两者的解决方案:
Mac JVM:Java 版本“1.7.0_45”Java(TM) SE 运行时环境(构建 1.7.0_45-b18)Java HotSpot(TM) 64 位服务器 VM(构建 24.45-b08,混合模式)
Ubuntu JVM:java 版本“1.7.0_25”OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2) OpenJDK 64-Bit Server VM(build 23.7-b01,混合模式)