我正在开发一个工具,从一个给定的文件夹抓取所有的文本文件。这些文本文件包含一堆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线程上运行工具时间歇性地遇到的一些异常。
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();
}
}
}发布于 2011-08-30 13:37:15
这是更新和回答。
堆空间用完了,代码中没有Throwable。一旦我加进去,我发现我的记忆快用完了。所以我使用了-Xmx512标志,如下所示
java -Xmx512m -jar Tool.jar
这本身并没有解决问题。ReportNG有一个问题,我不断地遇到异常。所以我禁用了ReportNG
同样,这并没有解决这个问题,对于URL超过100 K,现在TestNG报告开始消耗大量内存,所以我不得不通过将标志setUseDefaultListeners更改为false来禁用TestNG报告。
在所有这些更改之后,一切都开始对任意数量的记录起作用。只是我目前唯一的报道是log4j,我可以接受这一点。
感谢大家看了看这个。
发布于 2011-08-14 04:55:47
你试过吗?只需打印线程in,再次检查这些方法是否确实并行运行。如果不是,请给我发邮件给我一个显示问题的自带的小测试类。
https://stackoverflow.com/questions/7054790
复制相似问题