简单(st)Datomic测试程序在退出时挂起

时间:2013-08-12 03:33:00

标签: clojure 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

并挂起。只有在程序启动时DB不存在时才会挂起。

任何人都知道为什么或如何解决?这适用于datomic-free-0.8.4020.26datomic-free-0.8.3941

更新 - 上述程序确实会终止,但需要很长时间(> 1分钟)。我想知道原因。

2 个答案:

答案 0 :(得分:1)

shutdown-agents最多需要一分钟才能完成(假设没有代理正在运行某个操作)。

这是由于java.util.concurrent缓存线程池的工作方式。

答案 1 :(得分:0)

使用datomic.api/shutdown

  

关闭

     

功能

     

用法:( 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)))