2013-08-10 9 views
1

부두가 "7.6.8.v20121106"이고 내 서버가 https://github.com/ring-clojure/ring/tree/master/ring-jetty-adapter입니다.부두 실이 막히거나 죽은 채 잠겼습니다.

다음 코드를 사용하여 http://http-kit.org/을 사용하여 전화를 걸고 있습니다. 기본적으로 서버 호출을하지만 응답을 무시합니다. 내가 아는 것은 모든 서버 스레드가 차단/교착 상태가되는 것입니다. 이것은 서버 다운을 가져 오는 아주 쉬운 방법 인 것처럼 보이며 여기에서 무슨 일이 벌어지고 있는지 이해하고 싶었습니다. 클라이언트에서

코드는 다음과 같습니다

(require '[org.httpkit.client :as hk-client]) 

(defn hget [id] 
    (hk-client/get (str "http://localhost:5000/v1/pubapis/auth/ping?ping=" id))) 

(doall (map hget (take 100 (range))))) ; Gives problem 
(doall (map deref (map hget (take 100 (range)))))) ; Doesn't give problem 

Thread status

에서 차단 스레드

sun.nio.cs.StreamEncoder.write (StreamEncoder.java:118)

에서 교착 상태

java.io.PrintStream.write (PrintStream.java:479)

누군가가 여기에서 진행되는 일을 도울 수 있다면 정말로 감사 할 것입니다.

답변

1

마지막으로 문제가 무엇인지 확인했습니다. 많은 것을 파고 들었고 이것을 발견하기위한 샘플 프로젝트부터 시작했습니다.

(defn log [msg & vals] 
    (let [line (apply format msg vals)] 
    (locking System/out (println line)))) 

라인이 이상 어떤 상황에서 죽은 잠금 장치가 발생시킨 잠금 : 내가 Clojure의를 배우기 시작하고 로깅에 어딘가에서 다음 복사 . 이것을 해결하기 위해 동시성에 대해 충분히 알지 못한다. 그것에 대한 별도의 질문을 만들 것입니다.

이 줄을 제거하면 문제가 해결됩니다.

+0

해당 줄을 차단하면 클라이언트가 소켓에서 읽지 못했음을 나타냅니다. 서버가 혼잡 한 연결 (쓰기위한 것이거나 읽는 것이 아무것도 없습니다)에서 그 스레드를 차단했습니다. "그러나 응답을 무시하십시오"라고 말하면 응답을 읽거나 연결을 종료하시기 바랍니다. –

+0

이 코드는 서버에서 실행 중입니다. 그리고 미들웨어의 라인이 로그를 호출합니다. 클라이언트가 http 요청을하고 응답을 무시합니다. 즉, https://github.com/http-kit/http-kit/issues/66#issuecomment-22441928에 따라 클라이언트의 응답을 수신하고 디코딩 한 다음 쓰레기 수거. " –