Since Clojure has been designed for concurrency, why does the author have to resort to Java thread pools to solve this straightforwardly parallel problem?
Because clojure has a number of built-in ways to manage state in a multi-threaded program, but does not re-implement work queues as there are quite excellent implementations bundled with the JDK. Rich Hickey mentions this during his concurrency talk, if Im not mistaken.
Good analysis of problems using Clojure agents for operations that can fail. Also, Mark McGranaghan's new clj-http project looks good (BTW, I had a slight problem with one of Mark's old projects over the weekend and he was helpful - good to see on open source projects).