我想编写一个程序来ping至少10000个URL。我写了一个小程序,发现它没有我预期的那么快。
对100个网址执行Ping操作需要3-4分钟。
有人有任何建议以更好的方式做到这一点。
private static Map<String, String> findUnreachableUrls(Set urls) { Map<String, String> badUrls = new TreeMap<>(); for (String url : urls) { HttpURLConnection connection; try { connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("HEAD"); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode != 200 || responseCode != 302) { badUrls.put(url, Integer.toString(responseCode)); } } catch (IOException e) { badUrls.put(url, e.getMessage()); }
}
return badUrls;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要提高批量ping URL的效率,你可以考虑以下几种策略:
多线程/并发处理:Java提供了丰富的并发编程工具,如ExecutorService
和Future
,可以用来并行执行任务。通过将URL列表分割成多个子集,并为每个子集分配一个线程或任务,可以在多核处理器上显著提高效率。
示例代码:
ExecutorService executor = Executors.newFixedThreadPool(100); // 根据实际情况调整线程池大小
List<Future<Map.Entry<String, String>>> futures = new ArrayList<>();
for (String url : urls) {
Future<Map.Entry<String, String>> future = executor.submit(() -> {
// 你的ping逻辑
HttpURLConnection connection = null;
try {
// ...(与之前相同的连接、请求方法和响应码检查逻辑)
return new AbstractMap.SimpleEntry<>(url, "OK"); // 或者错误信息
} catch (IOException e) {
return new AbstractMap.SimpleEntry<>(url, e.getMessage());
} finally {
if (connection != null) {
connection.disconnect();
}
}
});
futures.add(future);
}
Map<String, String> badUrls = new TreeMap<>();
for (Future<Map.Entry<String, String>> future : futures) {
try {
Map.Entry<String, String> result = future.get();
if (!"OK".equals(result.getValue())) {
badUrls.put(result.getKey(), result.getValue());
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
使用更高效的HTTP客户端:虽然HttpURLConnection
是Java标准库的一部分,但其他第三方库如Apache HttpClient或OkHttp可能提供更好的性能和更简洁的API。
减少DNS查询:DNS解析可能会消耗大量时间,尤其是在重复访问同一域名下的不同URL时。考虑缓存DNS查询结果。
优化网络设置:确保你的网络环境对大量并发连接没有限制,或者尝试调整TCP参数以优化连接速度(这通常需要管理员权限)。
异步调用与回调:如果适用,使用异步调用模式可以避免线程等待,进一步提升效率。
利用云服务:如果你的业务场景允许,可以考虑使用阿里云等云服务商提供的API来实现大规模的URL健康检查,比如阿里云的链路追踪或应用高可用服务AHAS,这些服务专为大规模分布式系统设计,能有效管理和监控服务间的依赖关系及健康状态。
结合以上策略,你应该能够显著提升ping URL的速度。记得在实际部署前进行充分的测试,以确保解决方案的稳定性和效率。
你好,我是AI助理
可以解答问题、推荐解决方案等