Когда следующая программа Clojure-образца упакована в автономный uberjar (через boot-clj), выполнение java -jar app.jar
ведет себя иначе, чем вызов функции -main
из репликации разработки.проблемы с процессом слияния изнутри uberjar
(ns bat-man.core
(:require [clojure.java.shell :refer [sh]])
(:gen-class))
(defn -main [& args]
(prn (sh "echo" "test")))
Что происходит, является то, что результат {:exit 0, :out "test\n", :err ""}
немедленно выводится на stdout
, но после того, что она занимает по времени, может быть, полминуты, пока программа фактически не выйдет.
Это не тот случай, когда программа была изменена, чтобы просто напечатать некоторый вывод, не вызывающий sh
.
В процессе разработки, все как и ожидалось, функция заканчивается сразу после печати. Как это можно объяснить/зафиксировать?
Update: Вот выдержка из ps aux
принято в то время программа берет свое время, чтобы закончить:
unsername 8730 5.4 2.0 3643576 80052 pts/8 Sl+ 13:25 0:01 java -jar /path/to/app.jar
Это решение работает? Фьючерсы и агенты IIRC используют разные пулы потоков. – OlegTheCat
Кажется, остается прежним. Может быть, полезно, из документов shutdown-агентов: «Запуск действий будет завершен, но никаких новых действий не будет принято» –
@OlegTheCat Да, это должно сработать. См. Этот ответ: http://stackoverflow.com/questions/3393497/future-promises-in-clojure-hangs-on-me –