是否有任何有效的方法可以并行化Java中大量的GET请求。我有一个200,000行的文件,每行需要Wikimedia的GET请求。然后,我必须将部分响应写到一个通用文件中。我在下面粘贴了我代码的主要部分作为引用。

while ((line = br.readLine()) != null) {
    count++;
    if ((count % 1000) == 0) {
        System.out.println(count + " tags parsed");
        fbw.flush();
        bw.flush();
    }
    //System.out.println(line);
    String target = new String(line);
    if (target.startsWith("\"") && (target.endsWith("\""))) {
        target = target.replaceAll("\"", "");
    }
    String url = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&format=xml&rvprop=timestamp&rvlimit=1&rvdir=newer&titles=";
    url = url + URLEncoder.encode(target, "UTF-8");
    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    // optional default is GET
    con.setRequestMethod("GET");
    //add request header
    //con.setRequestProperty("User-Agent", USER_AGENT);
    int responsecode = con.getResponseCode();
    //System.out.println("Sending 'Get' request to URL: " + url);
    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();
    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    Document doc = loadXMLFromString(response.toString());
    NodeList x = doc.getElementsByTagName("revisions");
    if (x.getLength() == 1) {
        String time = x.item(0).getFirstChild().getAttributes().item(0).getTextContent().substring(0,10).replaceAll("-", "");
        bw.write(line + "\t" + time + "\n");
    } else if (x.getLength() == 2) {
        String time = x.item(1).getFirstChild().getAttributes().item(0).getTextContent().substring(0, 10).replaceAll("-", "");
        bw.write(line + "\t" + time + "\n");
    } else {
        fbw.write(line + "\t" + "NULL" + "\n");
    }
}

我用谷歌搜索,似乎有两个选择。一种是创建线程,另一种是使用称为执行程序的东西。有人可以提供一些指导,以指导哪种方法更适合此任务吗?

最佳答案

如果确实需要通过GET请求执行此操作,建议您将ThreadPoolExecutor与小型线程池(2或3)一起使用,以避免Wikipedia服务器重载。这样可以避免很多编码...

还可以考虑使用Apache HttpClient库(具有持久连接!)。

但是使用数据库下载选项是一个更好的主意。根据您的工作,您可以选择较小的下载之一。 This page讨论了各种选项。

注意:Wikipedia希望人们下载数据库转储(etcetera),而不是捣乱他们的Web服务器。

10-07 23:30