【问题标题】:clojure.java.shell/sh throws RejectedExecutionException when run in a new threadclojure.java.shell/sh 在新线程中运行时抛出 RejectedExecutionException
【发布时间】:2011-08-31 15:05:49
【问题描述】:

在一个新的 leiningen 项目中,其 core.clj 包含

(defn show-cmd
  []
  (-> (shell/sh "ls")
    :out
    println))

(defn -main
  []
  (.start (Thread. show-cmd)))

完整图片请参见https://gist.github.com/1183753

所以,当我对上述项目执行lein run 时,会抛出 RejectedExecutionException。完整的堆栈跟踪在 gist 中。

但是,当放入 .clj 文件并直接使用 clojure 运行时,上述工作正常,工作流程中没有 leiningen。这是 leiningen/clojure 中的错误还是只有我?

如果是错误,请告诉我如何让相关人员知道,因为这是我第一次发现错误:)

谢谢。

更新 接受@skuro 的建议,我用leiningen 的master 分支克隆尝试了我的例子,但我仍然得到同样的错误,如图所示

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    这是 Leiningen 的一个已知问题,不幸的是 won't be fixed soon。修复它会导致其他东西损坏。解决方法是强制主函数永不返回:

    (defn -main
      []
      (.start (Thread. show-cmd))
      @(promise))
    

    在这里,由于承诺永远不会实现,main 将永远等待,从而防止 Leiningen 关闭运行代理、期货等的 executor。

    【讨论】:

    • 是的,这种解决方法可以解决问题。我希望它很快得到修复:)。谢谢。
    • 其实这个在 1.6.1.1 已经修复了
    【解决方案2】:

    您需要升级到最新最好的 leiningen 版本,可能是从源代码编译的。有一个带有 leiningen 的known bug 可以防止线程被正确执行。该主题还有other questions,搜索可能会有所帮助。

    【讨论】:

    • 好吧,我的 google-fu 又一次让我失望了。我会检查 lein 的主版本。谢谢。
    • 我克隆了 repo 并用它进行了测试,但我仍然看到错误。查看问题,更新了详细信息。
    【解决方案3】:

    我看到这与运行 leiningen 时无法打开标准输入和错误有关。为了解决这个问题,我使用了

    lein uberjar && java -jar projectstandalone.jar args.
    

    它有点慢,但工作正常

    【讨论】:

    • 谢谢,但正如你所说,这种方法很慢。恐怕对我的口味来说有点太慢了。我暂时恢复到 leiningen 1.5.2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多