来自Java代码的大量Web调用

时间:2014-08-09 15:46:57

标签: java multithreading url volumes

我正在用Java编写一个程序,该程序必须对同一服务器上的各个页面进行大约650万次调用(通过附加将从文本文件中读取的用户名稍微改变URL)。首先,我想要知道最有效的方法,其次,任何人都可以猜测这可能消耗多少时间?目前我在ExecutorService对象的一个​​单独的线程中读取每个url ..类似这样的

ExecutorService executor = Executors.newFixedThreadPool(10);
Runnable worker = new MyRunnable(allUsers[n]);
executor.execute(worker);

并且run方法如下:

is = url.openStream();  // throws an IOException
br = new BufferedReader(new InputStreamReader(is));


while ((line = br.readLine()) != null) {
    page = page + line;

    // More code follows

}

任何建议都将受到高度赞赏

2 个答案:

答案 0 :(得分:0)

  • 不,没人能猜出多少"时间"这将消耗。我们不知道服务器是否需要一毫秒或一小时才能完成请求。

  • 最有效的方法是使用更高效的API,允许批量请求。

  • 在10个线程中,您的程序很可能是IO绑定的。您需要分析确保完全CPU使用所需的线程数。您可以使用Java 7功能/ NIO框架(如Netty或MINA)来避免这种情况,因此一个线程可以同时为多个请求提供服务。 (我不确定这些是否是客户端)。

答案 1 :(得分:0)

我同意其他评论和答案,无法预测这需要多长时间,并且“批量转移”请求最有可能提供更好的性能。

还有几点:

  • 如果您可以使用返回JSON或XML而不是网页的RESTful API,那将会更快。

  • 在客户端,如果您提取的文档很大,这将会很有效:

        while ((line = br.readLine()) != null) {
            page = page + line;
        }
    

    这将会进行过多的复制。更好的方法是:

        StringBuilder sb = new StringBuilder(...);
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        page = sb.toString();
    

    如果您可以很好地估算页面大小,那么请创建那个大的StringBuilder