2013-08-12 1 views
1

다음 프로그램은 überjar에서 실행될 때 메모리 내 Datomic 데이터베이스를 사용할 때만 끝납니다. Datomic 서버에 연결할 때, 그것은 오히려 JVM을 종료하는 것보다 무기한 중단 :Simple (st) 출구에서 Datomic 테스트 프로그램이 멈 춥니 다.

(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 분 초과). 이유를 알고 싶습니다.

+1

당신에게'(D/해제 CONN)'를 시도? –

+0

명백한 차이는 없지만 시도해 보았습니다. 그러나 그 과정에서 위의 프로그램이 결국 종료된다는 것을 알았습니다. 단지 1 분 이상 걸립니다 (!!!). – JohnJ

답변

1

shutdown-agents은 완료하는 데 최대 1 분이 걸립니다 (어떤 에이전트도 조치를 취하지 않는다고 가정).

이것은 java.util.concurrent 캐시 된 스레드 풀이 작동하는 방식 때문입니다.

+0

감사합니다. 이 프로그램은'shutdown-agents'를 사용 하느냐에 관계없이 1 분 정도 소요됩니다. 왜 그런가? – JohnJ

+0

Datomic이 호출하는 것 같군요? 그때 그 프로그램은 영원히 멈출 것입니다 ... – vemv

+0

감사합니다. 나는 1 분 시간계가 일치한다는 사실을 받아 들였습니다. 'shutdown-agents'를 제거했습니다. – JohnJ

0

사용 datomic.api/shutdown

종료

기능은

는 사용법 : (종료가 종료-Clojure의)

종료 모든 자원을 피어. 이 메소드는 JVM 프로세스 의 완전 종료의 일부로 호출되어야합니다. 모든 연결을 해제하고 시스템 종료가 인 경우 Clojure 자원을 해제합니다. Clojure 으로 작성된 프로그램은 Datomic 외부의 Clojure 리소스 (예 : 에이전트)을 관리하면 shutdown-clojure를 false로 설정할 수 있습니다. 다른 JVM 언어로 작성된 프로그램은 일반적으로 shutdown-clojure를 true로 설정해야합니다.

추가 Clojure의 버전 Datomic에서이 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)))