Hey Jon,
not sure you're interested in fixing this (and we moved to core.async for this kind of logic) but after catching a Throwable the thread exits the recur loop and become inactive. If each thread throws at least one error (likely with a large number of http requests as a job for example) then entire machine stops filling the output lazy seq and become stuck. Suggestion: it should always maintain the same number of threads in the thread pool on errors.