gpt4 book ai didi

java - 避免 SocketTimeoutException 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 13:16:02 26 4
gpt4 key购买 nike

我正在编写一个小应用程序,它使用深度优先搜索通过URL扫描所有页面。所以我应该多联系。在 n 页之后,我通常会捕获 SocketTimeoutException 并且我的应用程序崩溃。那么避免这种情况的最佳方法是什么?也许增加超时之类的?这就是我使用递归的方法:

public static ArrayList<String> getResponse(String url) throws IOException {
ArrayList<String> resultList = new ArrayList<>();
try {
Document doc = Jsoup.connect(url).get();
Elements links = doc.select("a");
int j = 0;

for (int i = 0; i < links.size(); i++) {
if (links.get(i).attr("abs:href").contains("http")) {
resultList.add(j, links.get(i).attr("abs:href"));
j++;
}
}
return resultList;
} catch (HttpStatusException e) {

resultList.add(0, "");
return resultList;
} catch (SocketTimeoutException e) {
getResponse(url);
}
return resultList;
}

它应该发送请求,直到没有 SocketTimeoutException。我说得对吗?

最佳答案

我会稍微改变一下惯例:

public static ArrayList<String> getResponse(String url) throws IOException {
return getResponse(ulr, 3);
}

private static ArrayList<String> getResponse(String url, int retryCount) throws IOException {
ArrayList<String> resultList = new ArrayList<>();
if (retryCount <= 0){
//fail gracefully
resultList.add(0, "");
return resultList;
}
retryCount--;
try {
Document doc = Jsoup.connect(url).timeout(10000).get();
Elements links = doc.select("a");
int j = 0;

for (int i = 0; i < links.size(); i++) {
if (links.get(i).attr("abs:href").contains("http")) {
resultList.add(j, links.get(i).attr("abs:href"));
j++;
}
}
return resultList;
} catch (HttpStatusException e) {

resultList.add(0, "");
return resultList;
} catch (SocketTimeoutException e) {

getResponse(url, retryCount);
}
return resultList;
}

这会将每个连接的超时设置为 10 秒。超时(0)将永远等待。然而,这是危险的,因为你实际上可能永远无法完成你的例行公事。这取决于您对实际能够访问该 URL 的确定程度。

第二种机制是为了避免无限递归,这可能就是你的程序失败的原因。交出一个计数器并仅在计数器大于 0 时重试即可达到目的。

关于java - 避免 SocketTimeoutException 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22462619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com