2015-07-20 73 views
4

我尝试使用Cassaforte来查询我的cassandra db,但是当我启动我的代码时,它永远不会结束。Cassaforte/clojure:永不结束的程序

(defn cassandra [] 
    (let [conn (cc/connect ["127.0.0.1", "127.0.0.2", "127.0.0.3"]) 
     table "mytable"] 
    (cql/use-keyspace conn "mykeyspace") 
    (cql/select conn table (limit 10)))) 

(defn -main 
    "I don't do a whole lot ... yet" 
    [& args] 
    (println "Hello, World!") 
    (let [result (cassandra)])) 

结果:

$ lein run 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
Hello, World! 
[the program is waiting here] 

如果我打印结果变种,它包含了行,但经过同样的问题。

有什么想法?

回答

3

你的程序完成后,你只是没有告诉JVM你明确地想要在主结束时退出。你可以通过添加:

(System/exit 0) 

到你的主结束。与只用java编写的相对较小的程序不同,Clojure已经在后台启动了一些线程池,以便代理运行在其上。这些导致JVM认为某个线程可能仍然需要运行,并且不会立即退出。从那以后,这已被Clojure社区采用。

+0

它的工作原理,谢谢! – Arthe

+0

java驱动程序(cassaforte使用)也创建一些线程池。您可以通过关闭客户端(cc/disconnect)来关闭这些服务器。 –

+0

(cc/disconnect)只会关闭会话,您想使用(cc/disconnect!)来关闭集群 –