Compojure OutOfMemoryError:无法创建新的本机线程

时间:2015-01-15 06:38:41

标签: clojure jetty compojure

"每个进程限制为100个线程。所以当我超过这个限制时,我得到:java.lang.OutOfMemoryError:无法创建新的本机线程。 Compojure正在使用码头环适配器。是否有配置 服务器一次只接受一百个线程到servlet?"

这里似乎有一个简洁的解决方案,但似乎已经过时了:

Limiting the number of threads Compojure spawns

我把它放在我的project.clj中:

  

:dependencies [[org.clojure / clojure" 1.6.0"]                    [compojure" 1.1.8"]                    [ring / ring-json" 0.3.1"]                    [c3p0 / c3p0" 0.9.1.2"]                    [org.clojure / java.jdbc" 0.2.3"]                    [cheshire" 5.4.0"]                    [ring / ring-jetty-adapter" 1.1.8"]                    [环境" 0.2.1"]                    [hiccup" 1.0.0"]                    [com.novemberain / monger" 2.0.0"]                    [org.clojure / data.json" 0.2.5"]]

我把它放在我的控制器文件中:

  

(:import [org.mortbay.thread.QueuedThreadPool])

...

  

(defn -main [](run-jetty app {:port(if(nil?(System / getenv)   " PORT&#34))                             8000; localhost还是heroku?                             (Integer / parseInt(System / getenv" PORT")))                     :configurator#(。setThreadPool%(QueuedThreadPool.100))                   }))

当我尝试时,我得到了:

线程中的异常" main" java.lang.IllegalArgumentException:无法解析类名:QueuedThreadPool,编译:

你能否向我推荐一个clojure插件注入我的库中的建议,以免在Heroku中为每个进程限制惊吓100个线程?

1 个答案:

答案 0 :(得分:1)

您似乎使用的是过期版本的ring / ring-jetty-adapter(1.1.8),最新版本是1.3.2。

在最新版本中,您只需指定:ring.adapter.jetty / run-jetty选项中的max-threads。

因此,要限制jetty使用的最大线程数,可以执行以下操作:

(defn -main [] (run-jetty #'app
                          {:port (Integer/parseInt (or (System/getenv "PORT") "8000"))
                           :max-threads 100}) )

当然,JVM中可能存在其他线程,这意味着您可能必须降低分配给jetty的线程数,以便不超过Heroku限制。

如果您仍想使用QueuedThreadPool,则需要使用:

(:import [org.eclipse.jetty.util.thread QueuedThreadPool])

而不是

(:import [org.mortbay.thread.QueuedThreadPool])