首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中并发HTTP连接

Java中并发HTTP连接
EN

Stack Overflow用户
提问于 2011-08-14 03:23:51
回答 2查看 2.6K关注 0票数 0

我正在开发一个工具,从一个给定的文件夹抓取所有的文本文件。这些文本文件包含一堆http URL。要求我对这些URL执行一个GET请求,记录响应代码,并可选择地打印输入流。我必须以多线程的方式执行此操作,并且线程计数应该是可配置的。因此,我使用TestNG并使用数据提供程序和parallel=true进行设置。这是我到目前为止所拥有的。我做得对吗?

Edit#2,我发现的另一个问题是,当我为90K URL和100个threads..The运行这个工具时,请求在一开始就被快速发送,但经过一段时间之后,它们明显地减慢了。这里有什么问题?

Edit#1,我能够运行这个工具来处理少量的记录,比如几千条记录,但是我无法运行大量的URL(250 K)和线程(2500条)。我正在使用ReportNG生成报告。下面是我在250 K URL和2500线程上运行工具时间歇性地遇到的一些异常。

代码语言:javascript
复制
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at com.HTTPConn.doHttpUrlConnectionAction(HTTPConn.java:83)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at 

org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:673)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:842)
    at org.testng.internal.TestMethodWithDataProviderMethodWorker.call(TestMethodWithDataProviderMethodWorker.java:73)
    at org.testng.internal.TestMethodWithDataProviderMethodWorker.call(TestMethodWithDataProviderMethodWorker.java:14) 

    [TestNG] Reporter org.uncommons.reportng.HTMLReporter@eee36c failed
org.uncommons.reportng.ReportNGException: Failed generating HTML report.
    at org.uncommons.reportng.HTMLReporter.generateReport(HTMLReporter.java:118)
    at org.testng.TestNG.generateReports(TestNG.java:1053)
    at org.testng.TestNG.run(TestNG.java:1016)
    at com.TestNGRunner.main(TestNGRunner.java:83)
Caused by: java.lang.NullPointerException
    at java.lang.String.compareTo(Unknown Source)
    at org.uncommons.reportng.TestResultComparator.compare(TestResultComparator.java:29)
    at org.uncommons.reportng.TestResultComparator.compare(TestResultComparator.java:25)
    at java.util.Collections.indexedBinarySearch(Unknown Source)
    at java.util.Collections.binarySearch(Unknown Source)
    at org.uncommons.reportng.HTMLReporter.sortByTestClass(HTMLReporter.java:229)
    at org.uncommons.reportng.HTMLReporter.createResults(HTMLReporter.java:180)
    at org.uncommons.reportng.HTMLReporter.generateReport(HTMLReporter.java:110)
    ... 3 more


public class HTTPConn {
    Logger log;
    File folder;
    boolean isStreamRequired;
    @BeforeClass(alwaysRun=true)
    public void setup(){
        log = Logger.getLogger(HTTPConn.class);
        folder = new File("c:\path\to\folder\from\where\I\want\to\read\textfiles");
        isStreamRequired = false;
    }

    @DataProvider(name="getRecords", parallel=true)
    public Object[][] getURLsFromTheFile() throws IOException {
        try {
            File [] listFiles = folder.listFiles();
            int i=0;
            Object[][] result = null;
            ArrayList<String> totalList = new ArrayList<String>();          
            for(int ind=0;ind<listFiles.length;ind++){
                if(listFiles[ind].isFile()){
                    List<String> arrList =FileUtils.readLines(listFiles[ind]); 
                    totalList.addAll(arrList);//add files one by one
                }
            }           
            result=new Object[totalList.size()][];                  
            for(String s:totalList){                        
             result[i]=new Object[]{s};
             i++;
         }              
         return result;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }
 }
    @Test(dataProvider = "getRecords")
    public void doHttpUrlConnectionAction(String desiredUrl){
         try {
              URL url = new URL(desiredUrl);
              HttpURLConnection connection = (HttpURLConnection) url.openConnection();
              connection.setRequestMethod("GET");             
              connection.connect();
              int responseCode = connection.getResponseCode();  
              log.info("\nResponse Code:"+ desiredUrl+"\n"+responseCode+"\n");        
              if(responseCode!=200)
                  Assert.fail("Response Code:"+responseCode);
              else
                  Reporter.log("Response Code:"+responseCode);
              // read the output from the server
              if(isStreamRequired) {
                 //read the input stream and print it to log
                  reader.close();               
            }//isStreamOutputRequired           
              connection.disconnect();           
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-30 13:37:15

这是更新和回答。

堆空间用完了,代码中没有Throwable。一旦我加进去,我发现我的记忆快用完了。所以我使用了-Xmx512标志,如下所示

java -Xmx512m -jar Tool.jar

这本身并没有解决问题。ReportNG有一个问题,我不断地遇到异常。所以我禁用了ReportNG

同样,这并没有解决这个问题,对于URL超过100 K,现在TestNG报告开始消耗大量内存,所以我不得不通过将标志setUseDefaultListeners更改为false来禁用TestNG报告。

在所有这些更改之后,一切都开始对任意数量的记录起作用。只是我目前唯一的报道是log4j,我可以接受这一点。

感谢大家看了看这个。

票数 0
EN

Stack Overflow用户

发布于 2011-08-14 04:55:47

你试过吗?只需打印线程in,再次检查这些方法是否确实并行运行。如果不是,请给我发邮件给我一个显示问题的自带的小测试类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7054790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档