2012-09-02 57 views
1

我對兩件事感到困惑。一,錯誤信息本身。而且,這個代碼加速了這麼多線程。我認爲它會啓動2或3個線程來響應單個請求,但是當我在localhost上運行這個線程並將瀏覽器指向它(僅僅一次)時,它會激活40個線程。無可否認,我使用的是Chrome,它在後臺發送了3個請求,出於各種複雜的原因,谷歌作爲一種「功能」(速度)辯護。線程上的Clojure錯誤:java.lang.IllegalArgumentException:鍵必須是整數

這個錯誤是什麼意思?

Exception in thread "Thread-39" java.lang.IllegalArgumentException: Key must be integer 
at clojure.lang.APersistentVector.invoke(APersistentVector.java:250) 
at serve_pages_from_memory.core$listen_and_respond$fn__51.invoke(core.clj:30) 
at clojure.lang.AFn.run(AFn.java:24) 
at java.lang.Thread.run(Thread.java:680) 

我看到類似的錯誤已經在計算器上之前已經討論過,但我不知道他們是如何配合我的問題:

clojure filter map by keys

我想要建立一個簡單的應用程序該服務頁面。我主要是爲了測試我自己對Clojure的知識。這裏的大部分代碼:

(defn start-thread [f] 
(doto (new Thread f) (.start))) 

(defn serve-page [wrt] 
(let [content-length (count page-string)] 
(. wrt println "HTTP/1.1 200 OK") 
(. wrt println "Content-Type: text/html; charset=UTF-8") 
(. wrt println "Connection: Keep-Alive") 
(. wrt println (str "Content-Length: " content-length)) 
(. wrt print "\r\n") 
(. wrt print page-string) 
(. wrt flush) 
(. wrt close))) 

(defn listen-and-respond [ss] 
(let [client (. ss accept)] 
(start-thread #([client] 
        (let [wrt (new PrintWriter (new BufferedWriter (new OutputStreamWriter (. client (getOutputStream)))))]   
        (serve-page wrt)))))) 

(defn create-server [port] 
(let [ss (new ServerSocket port)] 
(start-thread #(when-not (. ss (isClosed)) 
       (try (listen-and-respond ss) 
         (catch SocketException e)) 
       (recur))) 
ss)) 

(defn -main [& args] 
(println "Server is starting") 
(let [port (Integer/parseInt (first args))] 
(create-server port))) 

錯誤似乎是在抱怨這一行:

   (serve-page wrt)))))) 

但是,這是一個函數名和PrintWriter對象。錯誤信息會提示這是關於帶有鍵的地圖的東西。錯誤沒有意義。

有什麼建議嗎?

回答

4
#([client] 
    (let [wrt (new PrintWriter (new BufferedWriter (new OutputStreamWriter (. client (getOutputStream)))))]   
    (serve-page wrt))) 

是無稽之談。如果你想與命名參數拉姆達使用fn形式:

(fn [client] 
    (let [wrt (new PrintWriter (new BufferedWriter (new OutputStreamWriter (. client (getOutputStream)))))]   
    (serve-page wrt))) 
+0

謝謝,但與該改變我現在得到:「 異常的線程‘主題-3’clojure.lang.ArityException:ARGS數目錯誤(0)傳遞給:core $ listen-and-respond $ fn「,另外,在啓動並從瀏覽器發出1個請求後,我仍然獲得8個線程。有關線程多餘的任何想法? – cerhovice

+0

你顯然想要一個無限拉姆達:'(fn [] ...)'。你並不期待'client'被傳遞給函數,而只是簡單地關閉它。 – amalloy

相關問題