开发者社区 问答 正文

Java程序可ping数千个URL

我想编写一个程序来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;
}

展开
收起
被纵养的懒猫 2019-10-08 17:09:06 280 分享
分享
版权
举报
阿里云 AI 助理回答

要提高批量ping URL的效率,你可以考虑以下几种策略:

  1. 多线程/并发处理:Java提供了丰富的并发编程工具,如ExecutorServiceFuture,可以用来并行执行任务。通过将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();
    
  2. 使用更高效的HTTP客户端:虽然HttpURLConnection是Java标准库的一部分,但其他第三方库如Apache HttpClient或OkHttp可能提供更好的性能和更简洁的API。

  3. 减少DNS查询:DNS解析可能会消耗大量时间,尤其是在重复访问同一域名下的不同URL时。考虑缓存DNS查询结果。

  4. 优化网络设置:确保你的网络环境对大量并发连接没有限制,或者尝试调整TCP参数以优化连接速度(这通常需要管理员权限)。

  5. 异步调用与回调:如果适用,使用异步调用模式可以避免线程等待,进一步提升效率。

  6. 利用云服务:如果你的业务场景允许,可以考虑使用阿里云等云服务商提供的API来实现大规模的URL健康检查,比如阿里云的链路追踪或应用高可用服务AHAS,这些服务专为大规模分布式系统设计,能有效管理和监控服务间的依赖关系及健康状态。

结合以上策略,你应该能够显著提升ping URL的速度。记得在实际部署前进行充分的测试,以确保解决方案的稳定性和效率。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等