如果URL连接花费的时间太长,如何使Java函数每半秒重试一次URL连接?

如果URL连接花费的时间太长,如何使Java函数每半秒重试一次URL连接?,java,urlconnection,Java,Urlconnection,所以我有一个Java程序的问题。该程序的基本功能基本上包括连接到web API以获取数据。执行此操作的函数如下所示: public static Object getData(String sURL) throws IOException { URL url = new URL(sURL); URLConnection request = url.openConnection(); request.connect(); return request.getCo

所以我有一个Java程序的问题。该程序的基本功能基本上包括连接到web API以获取数据。执行此操作的函数如下所示:

public static Object getData(String sURL) throws IOException {
    URL url = new URL(sURL);
    URLConnection request = url.openConnection();

    request.connect();

    return request.getContent();
}

虽然代码可以正常工作,但最近,在我家更换ISP后,我发现有时连接需要花费不合理的时间,大约10%的尝试需要10秒或更长的时间,而其他90%的尝试只需要大约200毫秒。我发现让我的程序在不同的线程中再次调用函数比等待这些连接中的某些连接最终连接要快

因此,我想更改功能,以便在500毫秒后,如果连接未建立,它将断开连接并尝试新的连接。我怎么能这样做


在网上的某个地方,我读到HttpURLConnection可能会有所帮助,但我不确定如何帮助。

我无法使用我的ISP重现这个问题。
我建议你深入研究这个问题,找到更好的解决办法。发送另一个请求对我来说似乎不够好。也许可以尝试另一种方式来获取数据,看看这是否适合你。无法确定,因为我无法重现该问题。

URLConnection
允许您在调用
connect()之前指定连接和读取超时:

设置指定的超时值(以毫秒为单位),以便在 打开与此引用的资源的通信链接 URLConnection。如果超时在连接恢复之前过期 建立后,将引发java.net.SocketTimeoutException。暂停 零被解释为无限超时

500毫秒超时时:

try {
    URLConnection request = url.openConnection();
    request.setConnectTimeout(500); // 500 ms
    request.connect();
    // on successful connection
} catch (SocketTimeoutException ex) {
    // on request timeout
}

这可以打包成一个循环,但我建议限制尝试次数。

Java的URLConnection没有重试功能,因此实现这一点的最佳方法是使用适当的独立三方库,如。 到2020年为止,这是迄今为止最好的具有高级功能的独立三方HTTP客户端,目前仍在维护中

默认情况下,Apache Http客户端使用默认的
org.Apache.Http.Client.HttpRequestRetryHandler
,它会重试3次,但您可以使用自定义实现

配置可能如下所示(例如,完整地址):


搜索名称中包含单词
Timeout
的方法。1)这不是对所问问题的回答。2) 在没有提供替代方案的情况下说某样东西“对你来说不够好”,这甚至不是一种建设性的批评。也许你可以提出一些建议来改进答案?很公平。我找到了一个关于从URL获取数据的替代方法的教程。这种方法毫无帮助,但值得一试。我不能肯定,因为我无法重现这个问题,但值得一试。网络连接喜欢玩把戏。我认为解决这个问题的办法是建立一个低超时的连接,并可能使用自动重试。真正的解决方案当然是解决较低级别的网络问题。不管怎样,我不认为最初的问题与从一个连接中阅读有关,只是建立一个连接。非常感谢你,我会尝试一下,我很确定这就是我需要的。
org.apache.http.client.HttpClient httpClient = org.apache.http.impl.client.HttpClients.custom()
.setRetryHandler(YourCustomImplOfTheRetryHandlerClass)
//other config
.build();