проблемы с процессом размножения изнутри uberjar

Когда следующий образец программы Clojure упакован в автономный uberjar (через boot-clj), выполнение java -jar app.jar ведет себя иначе, чем вызов функции -main из отладочной реплики.

(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.

В отчете разработки все как положено, функция завершается сразу после печати. Как это можно объяснить/исправить?

Обновление: вот отрывок из ps aux, сделанный в то время, когда программа не торопится завершать работу:

unsername         8730  5.4  2.0 3643576 80052 pts/8   Sl+  13:25   0:01 java -jar /path/to/app.jar

person Anton Harald    schedule 18.08.2016    source источник


Ответы (1)


clojure.java.shell/sh использует future за кулисами, поэтому вам нужно вызвать (shutdown-agents), чтобы закрыть фоновые потоки.

person Curtis Summers    schedule 18.08.2016
comment
Это решение работает? Фьючерсы и агенты IIRC используют разные пулы потоков. - person OlegTheCat; 18.08.2016
comment
Кажется, остается то же поведение. Может быть полезно, из документов shutdown-agents: Запущенные действия будут завершены, но новые действия не будут приняты. - person Anton Harald; 18.08.2016
comment
@OlegTheCat Да, это должно сработать. См. этот ответ: stackoverflow.com /вопросы/3393497/ - person Curtis Summers; 18.08.2016