我需要发出一个经常会失败的HTTP请求,如果结果有效,我对结果完全不感兴趣。另外,我不想等待它返回。
所以,我希望将该调用包装在一个单独的线程中,并确保线程在某些东西阻塞时不会停留。
我目前的做法是这样的:
(defn- call-and-forget [url]
(let [timeout 250
combined-timeout (* timeout 2.5)
f (future
(try
(http/delete url
{:socket-timeout timeout
:conn-timeout timeout})
(catch Throwable e
(printf "Could not call %s: %s"
url (.getMessage e)))))]
(deref f combined-timeout)
(when-not (future-done? f)
(future-cancel f))))
我特此将此代码放在Apache 2.0许可证
下它使用clj-http来进行调用,使用Future来创建另一个线程。我使用内置池的线程和this thread中的讨论了解这一点。使用我自己的线程池,线程工厂,执行器服务,未捕获的处理程序等添加的复杂程度并不值得。
您是否同意上述代码是一个好的,有效的解决方案,或者您是否看到了更好的方法?
答案 0 :(得分:1)
看起来不错。你也可以这样做
(when (= :failed (deref f timeout-ms :failed))
(future-cancel f))