Clojure应用程序无法启动Heroku; Aleph + RedisToGo超时

dMi*_*Mix 4 clojure heroku

我的clojure noir应用程序在本地工作100%,连接到RedisToGo没问题.

问题是当我部署到Heroku(git push heroku master)时,我收到超时错误:

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
Run Code Online (Sandbox Code Playgroud)

完整日志在这里:https://gist.github.com/1842439

当我删除这个redis连接代码时,它部署正常:

(:use [aleph.redis :only (redis-client)])    
(def r (redis-client {:host redis-url :password redis-pass :port redis-port}))
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我运行"heroku run lein run repl"并粘贴上面的aleph代码时,它连接到redis并且我可以读/写数据.

所以它是关于heroku如何启动应用程序的东西,它打破了与RedisToGo的连接并将其计时.

ama*_*loy 5

在顶级做一些有效的事情是非常可疑的 - 代码在编译时和执行时都会被执行,因此自动的uberjar Heroku可能会失败,因为redis在编译时不可用,或类似的东西.

相反,-main在调用之后初始化redis客户端,这将确保您处于生产环境中.您可以通过多种方式完成此操作,例如,最初将其定义为nil然后执行alter-var-rootin -main.我的首选解决方案可能是:

(def r (delay (redis-client ...)))
(defn get-stuff []
  (let [client @r] ...))
(defn -main [& args]
  (get-stuff)
  ...)
Run Code Online (Sandbox Code Playgroud)

现在连接的代码直到某人derefs客户端才会执行,在应用程序启动并运行之前,他们不应该这样做.