2016-08-18 3 views
1

Когда следующая программа 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 

ответ

3

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

+0

Это решение работает? Фьючерсы и агенты IIRC используют разные пулы потоков. – OlegTheCat

+0

Кажется, остается прежним. Может быть, полезно, из документов shutdown-агентов: «Запуск действий будет завершен, но никаких новых действий не будет принято» –

+1

@OlegTheCat Да, это должно сработать. См. Этот ответ: http://stackoverflow.com/questions/3393497/future-promises-in-clojure-hangs-on-me –

Смежные вопросы