2012-02-16 2 views
4

내 클로저 노어 앱이 로컬에서 100 % 벌금으로 작동하며 RedisToGo에 아무런 문제가 없습니다.Clojure 앱이 Heroku에서 시작하지 않습니다. Aleph + RedisToGo 시간 초과

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

전체 로그가 여기에 있습니다 : : 나는 Heroku가 (자식 푸시 Heroku가 마스터)에 배포 할 때

문제는, 내가 시간 제한 오류가

나는이 레디 스 연결 코드를 제거 https://gist.github.com/1842439, 그것을 잘 배포 :

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

이상한 것은 내가 실행할 때 "Heroku가이 lein 실행 REPL을 실행"이상 알레프 코드에 붙여, 그것은 잘 레디 스에 연결하고 내가 할 수있는 데이터 읽기/쓰기.

그래서 heroku가 RedisToGo와의 연결을 끊고 타이밍을 어림하는 앱을 부팅하는 방법에 대해 설명합니다.

답변

5

최상위 수준에서 부작용을 일으키는 것은 매우 의심스러운 일입니다. 코드가 실행될 때뿐만 아니라 컴파일 될 때 실행되기 때문에 컴파일시에 redis를 사용할 수 없으므로 아마도 자동 uberjar Heroku가 실패합니다. 그런 식으로.

대신 -main이 호출 된 후 redis 클라이언트를 초기화하면 프로덕션 환경에 있도록 할 수 있습니다. 여러 가지 방법으로이 작업을 수행 할 수 있습니다. 예를 들어이를 처음에 nil로 정의한 다음 을 -main으로 수행합니다. 나의 선호하는 솔루션은 아마 것 같은 뭔가 : 이제

(def r (delay (redis-client ...))) 
(defn get-stuff [] 
    (let [client @r] ...)) 
(defn -main [& args] 
    (get-stuff) 
    ...) 

누군가가 애플 리케이션가 실행 될 때까지 그들이해서는 안 클라이언트를 derefs 때까지 수행되지 않습니다 연결하는 코드입니다.

+0

그래, 방금 redis 연결에 지연을 추가하고 테스트 된 배포에 동일한 시간 초과 문제가 발생했습니다. 커밋 : https://github.com/dmix/documeds/commit/2aca28bb228c36374e5a21bccbb774438bc1c223 – dMix

+0

중요한 것은 아니지만 왜'r'을 두 번 정의하고 있습니까? 귀하의 프로그램은 예외 일 수 있지만 대부분의 경우 응용 프로그램에서 공유 클라이언트를 원할 것 같습니다 (스레드간에 공유되지 않도록해야합니다) – amalloy

+0

고정을 배포하여 프로세스를 지연시키려는 시도가 수정 된 것으로 보입니다 문제. 나는 미래에 분리되어 실행될 것이기 때문에 스크레이퍼를 위해 별도로 redis 클라이언트를 정의 할 것입니다. – dMix