在发出HTTP请求时用java实现超时的最佳方法
在java.net.Socket上使用setSoTimeout更好,还是使用ExecutorService将进行Http调用的服务包装为另一个类,并使用Futures管理方法超时更好 更好目前被定义为良好实践/更可靠/准确。不一定要考虑对性能的影响,除非影响很大在发出HTTP请求时用java实现超时的最佳方法,java,multithreading,networking,Java,Multithreading,Networking,在java.net.Socket上使用setSoTimeout更好,还是使用ExecutorService将进行Http调用的服务包装为另一个类,并使用Futures管理方法超时更好 更好目前被定义为良好实践/更可靠/准确。不一定要考虑对性能的影响,除非影响很大 编辑:为了更清楚,还应该提到java.net.Socket上的connect(SocketAddress端点,int timeout)方法。两者都没有?使用HttpURLConnection.setReadTimeout()和setCo
编辑:为了更清楚,还应该提到java.net.Socket上的connect(SocketAddress端点,int timeout)方法。两者都没有?使用
HttpURLConnection.setReadTimeout()
和setConnectTimeout()
BenG——我认为这是一个“取决于您想要什么”的场景——如果您在并发libs上进行规范化,这很好,但您需要自己管理关闭套接字
如果你想使用超时,它会帮你的
如果您在代码中的任何地方都使用并发lib,并且它们感觉非常自然,那么您可以自己手动管理套接字
在技术上(如果你看一下套接字内部的代码),这两者都没有什么大的优势。只要确保在将来处理套接字状态时,能够捕获潜在的IOException,这样处理将来的IOException就不会潜在地破坏执行线程。由于HttpURLConnection使用了我提到的套接字方法,我想您是在提倡使用这些方法。你能详细解释一下为什么这是一个更好的方法吗?@BenG-因为你通常不应该直接使用套接字来做http。有很多图书馆已经做到了这一点。我提到的类是jdk的一部分。它是一行额外的代码,触发内核中预先存在的特性,加上一个catch块,而不是启动另一个线程,线程堆栈有自己的成本,还有大量自定义代码。当然,
Future
方法实际上并没有终止读取。@EJP,超时只是调用套接字上的close(),它调用内核来执行实际的套接字关闭,对吗?我不确定您是否说超时(现在JDK中的实现方式)比自己调用方法更神奇。我完全同意在运行的VM中代码和开销更少(根据您给出的原因),但我只是想确保这里没有两个单独的“关闭”代码路径被执行。从我通读的代码中,我没有看到这一点。