Простая (st) тестовая программа Datomic зависает при выходе

Следующая программа при запуске из überjar завершает работу в конце только при использовании базы данных Datomic в памяти; при подключении к серверу Datomic он зависает на неопределенный срок, а не выходит из JVM:

(ns myns.example
  (:use [datomic.api :only [db q] :as d])
  (:gen-class))

;; WORKS: (def uri "datomic:mem://testdb")

(def uri "datomic:free://localhost:4334/testdb2")

(defn -main []
  (println 1)
  (when (d/create-database uri)
    (d/connect uri))
  (shutdown-agents)
  (println 2))

Беги как:

lein uberjar && java -cp target/myns-0.1.0-SNAPSHOT-standalone.jar myns.example

Выходы:

1
2

и зависает. Он зависает только в том случае, если БД не существует при запуске программы.

Кто-нибудь знает, почему, или как исправить? Это касается как datomic-free-0.8.4020.26, так и datomic-free-0.8.3941.

ОБНОВЛЕНИЕ -- указанная выше программа действительно завершает работу, но занимает очень много времени (> 1 минуты). Я хотел бы знать, почему.


person JohnJ    schedule 12.08.2013    source источник
comment
Вы пробовали (d/release conn)?   -  person Leon Grapenthin    schedule 12.08.2013
comment
Пробовал это без видимой разницы - но в процессе я узнал, что приведенная выше программа в конечном итоге завершается, просто это занимает больше минуты (!!!).   -  person JohnJ    schedule 12.08.2013


Ответы (2)


shutdown-agents занимает до одной минуты (при условии, что ни один агент не выполняет действие).

Это связано с тем, как работают java.util.concurrent кэшированные пулы потоков.

person deprecated    schedule 13.08.2013
comment
Спасибо! Программа занимает около минуты, независимо от того, беспокоюсь ли я о shutdown-agents. Есть идеи, почему? - person JohnJ; 13.08.2013
comment
Я предполагаю, что Datomic вызывает это? Если бы это было не так, то программа зависла бы навсегда... - person deprecated; 13.08.2013
comment
Спасибо, я принимаю это как принятый ответ, учитывая тот факт, что шкала времени в 1 минуту совпадает, несмотря на то, что я не понимаю, как произошло отключение, когда я удалил shutdown-agents. - person JohnJ; 13.08.2013
comment
Хотя я могу ошибаться, и время может быть просто совпадением. Попробуйте заснуть на 30 секунд, а затем отправить агенту напечатать какое-то значение. Если это удается, то агенты отключения не участвуют. - person deprecated; 13.08.2013

Используйте datomic.api/shutdown.

неисправность

функция

Использование: (shutdown shutdown-clojure)

Закройте все одноранговые ресурсы. Этот метод следует вызывать как часть чистого завершения процесса JVM. Освобождает все подключения и, если для shutdown-clojure установлено значение true, освобождает ресурсы Clojure. Программы, написанные на Clojure, могут установить для shutdown-clojure значение false, если они управляют ресурсами Clojure (например, агентами) вне Datomic; программы, написанные на других языках JVM, обычно должны устанавливать для shutdown-clojure значение true.

Добавлено в Datomic Clojure версии 0.8.3861

(ns myns.example
  (:require [datomic.api :as d])
  (:gen-class))

(def uri "datomic:free://localhost:4334/testdb2")

(defn -main []
  (d/create-database uri)
  (let [conn (d/connect uri)]
    (try
      ;; do something
      (finally (d/shutdown true)))
person Josh Headapohl    schedule 23.03.2016