以下程序从ü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
并挂起。只有在程序启动时DB不存在时才会挂起。
任何人都知道为什么或如何解决?这适用于datomic-free-0.8.4020.26
和datomic-free-0.8.3941
。
更新 - 上述程序确实会终止,但需要很长时间(> 1分钟)。我想知道原因。
答案 0 :(得分:1)
shutdown-agents
最多需要一分钟才能完成(假设没有代理正在运行某个操作)。
这是由于java.util.concurrent
缓存线程池的工作方式。
答案 1 :(得分:0)
关闭
功能
用法:( shutdown shutdown-clojure)
关闭所有同伴 资源。应该将此方法作为清除关闭的一部分来调用 一个JVM进程。将释放所有连接,并且,如果shutdown-clojure 是的,将发布Clojure资源。用Clojure编写的程序 如果他们管理Clojure资源,可以将shutdown-clojure设置为false (例如代理商)在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)))