1

私は2つのことに困惑しています。1 つは、エラー メッセージそのものです。そして 2 つ目は、このコードが非常に多くのスレッドを起動するという事実です。1 つのリクエストに応じて 2 つまたは 3 つのスレッドがスピンアップすると思っていましたが、これを localhost で実行し、ブラウザで (1 回だけ) スピンアップすると、40 スレッドがスピンアップします。確かに、Google が「機能」 (速度) として擁護するさまざまな複雑な理由から、バックグラウンドで 3 つのリクエストを送信する Chrome を使用していました。

このエラーはどういう意味ですか?

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)

同様のエラーが以前に StackOverflow で議論されているのを見ましたが、それらが私の問題にどのように結びついているかわかりません:

キーによるclojureフィルターマップ

ページを提供するシンプルなアプリを構築しようとしています。これは主に、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

1 に答える 1

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)))
于 2012-09-02T06:57:56.667 に答える