"每个进程限制为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个线程?
答案 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])