clojure.java.shell/sh在新线程中运行时抛出RejectedExecutionException
在一个新的fresh leiningen项目中,其core.clj包含clojure.java.shell/sh在新线程中运行时抛出RejectedExecutionException,clojure,leiningen,Clojure,Leiningen,在一个新的fresh leiningen项目中,其core.clj包含 (defn show-cmd [] (-> (shell/sh "ls") :out println)) (defn -main [] (.start (Thread. show-cmd))) 有关完整的图片,请参阅 因此,当我在上面的项目上运行lein时,会抛出一个RejectedExecutionException。完整的堆栈跟踪在要点中 但是,如果将上述操作放入.clj文件中,
(defn show-cmd
[]
(-> (shell/sh "ls")
:out
println))
(defn -main
[]
(.start (Thread. show-cmd)))
有关完整的图片,请参阅
因此,当我在上面的项目上运行lein
时,会抛出一个RejectedExecutionException。完整的堆栈跟踪在要点中
但是,如果将上述操作放入.clj
文件中,并直接使用clojure运行,而不在工作流中使用leiningen,则可以正常工作。这是leiningen/clojure的一个bug还是只有我
如果是bug,请告诉我如何让相关人员知道,因为这将是我第一次发现bug:)
谢谢
更新根据@skuro的建议,我尝试了我的莱宁根主分支克隆的例子,但仍然得到了相同的错误,如图所示
您需要升级到最新、最好的leiningen版本,可能需要从源代码处编译。leiningen有一个漏洞,它会阻止线程正确执行。在这个主题上也有一些问题,搜索可能会有所帮助。我发现这与无法打开标准输入和运行leiningen时出错有关。为了解决这个问题,我用了
lein uberjar && java -jar projectstandalone.jar args.
虽然速度稍慢,但仍能正常工作这是Leiningen的一个已知问题,不幸的是。修理它会导致其他东西断裂。解决方法是强制主功能永不返回:
(defn -main
[]
(.start (Thread. show-cmd))
@(promise))
在这里,由于承诺从未兑现,main将永远等待,从而防止Leiningen关闭代理、期货等的执行人。是的,又一次我的google fu让我失望了。我会和莱恩的主版本核对一下。谢谢。我克隆了回购协议并进行了测试,但我仍然看到了错误。请参阅问题,更新了详细信息。谢谢,但正如您所说,此方法速度较慢。恐怕对我的口味来说有点太慢了。我暂时回到了leiningen 1.5.2。是的,这种变通方法确实奏效了。但我希望它能尽快修复:)。谢谢。实际上,这在1.6.1.1中已修复