1

I am working through the example of making parallel http requests in Clojure,

http://lethain.com/a-couple-of-clojure-agent-examples/

In particular

(ns parallel-fetch
  (:import [java.io InputStream InputStreamReader BufferedReader]
           [java.net URL HttpURLConnection]))

(defn get-url [url]
  (let [conn (.openConnection (URL. url))]
    (.setRequestMethod conn "GET")
    (.connect conn)
    (with-open [stream (BufferedReader.
                       (InputStreamReader. (.getInputStream conn)))]
      (.toString (reduce #(.append %1 %2)
                          (StringBuffer.) (line-seq stream))))))

(defn get-urls [urls]
  (let [agents (doall (map #(agent %) urls))]
    (doseq [agent agents] (send-off agent get-url))
    (apply await-for 5000 agents)
    (doall (map #(deref %) agents))))

(prn (get-urls '("http://lethain.com" "http://willarson.com"))) 

When I run this in the

IllegalStateException await-for in transaction 

What does this mean and how do I fix it?

4

1 回答 1

1

考虑到对该问题的评论:

在加载您的命名空间的过程中正在设置一个事务,并且由于它get-urls在顶层调用,因此await-for该事务发生在该事务中并引发异常。

解决此问题的最佳方法是将prn / get-urls表单放入函数中,并且仅在加载命名空间后才调用它。(如果您想将此代码作为独立应用程序运行,使用überjarlein runjava -jar在 überjar 上运行,您可以在 内调用该函数-main。)

顺便说一句,事务是在您使用时设置的:reload-all,但不是没有它。(请参阅私有函数load-lib,它检查是否存在:reload-all并决定使用私有函数load-all(如果存在),以及load-all它本身,这是设置交易的地方。这是 1.5.1 源的链接。

于 2013-07-11T21:10:48.760 回答