Je développe un outil qui saisit tous les fichiers texte à partir d'un dossier donné. Ces fichiers texte contiennent un tas d'URL http. L'exigence est que je fais une demande GET à ces URL, consigner le code de réponse et éventuellement imprimer le flux d'entrée. Je dois effectuer cela de façon multi-thread et le nombre de threads devrait être configurable. J'utilise donc TestNG et utilise le fournisseur de données avec parallel = true pour le configurer. Voici ce que j'ai jusqu'ici. Est-ce que je fais ça correctement?connexions URL HTTP simultanées en Java
Edit # 2 L'autre question que je trouve que quand je lance cet outil pour 90K URL et 100 threads..The demandes sont envoyées rapidement au début, mais ils ralentissent remarquablement après un certain temps. Quel pourrait être le problème ici?
Edit # 1 Je suis en mesure d'exécuter cet outil pour petit nombre d'enregistrements comme quelques milliers, mais je ne suis pas en mesure pour un nombre significativement plus élevé d'URL (250K) et fils (2500). J'utilise ReportNG pour générer des rapports. Voici les exceptions que je reçois par intermittence lorsque je lance mon outil pour 250K URL et 2500 threads.
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 [email protected] 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();
}
}
}
Vous devriez probablement expliquer si quelque chose ne fonctionne pas comme prévu. Parce que, si ça marche, alors c'est juste. Si vous ne l'avez pas testé, alors vous devriez probablement l'essayer. Juste un FYI. – OverZealous