2011-08-14 6 views
-1

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(); 
     } 
    } 
} 
+2

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

Répondre

0

Voici la mise à jour et la réponse. Je manquais d'espace et je n'attirais pas Throwable dans mon code. Une fois que j'ai ajouté cela a découvert que je manque de mémoire. Donc, je -Xmx512 drapeau comme ci-dessous

java -Xmx512m jar Tool.jar

Cela en soi n'a pas résolu le problème. Il y avait un problème avec ReportNG et je recevais continuellement des exceptions. Alors j'ai désactivé à l'aide ReportNG

Encore une fois cela ne résout pas le problème, Pour les URL plus que 100K, maintenant rapport TestNG a commencé à prendre beaucoup de mémoire, donc je devais désactiver le rapport TestNG et en changeant le drapeau setUseDefaultListeners false

Après tous ces changements, tout a commencé à fonctionner pour n'importe quel nombre d'enregistrements. C'est juste que le seul rapport que j'ai à ce stade est log4j et je peux vivre avec ça.

Merci à tous pour jeter un oeil à ce.

2

Avez-vous déjà essayé? Imprimez simplement les identifiants des threads pour vérifier que ces méthodes fonctionnent bien en parallèle. Si ce n'est pas le cas, écrivez-moi une petite classe de test autonome qui montre le problème.

+0

les threads sont différents et la méthode s'exécute dans différents threads. Donc, je pense que TestNG fonctionne correctement comme prévu. C'est juste que j'obtiens des exceptions par intermittence pour un plus grand nombre d'enregistrements. Je ne suis pas sûr s'il y a une faille dans mon code ou l'exception est liée à TestNG ou ReportNG – nilesh

+0

Cela ressemble au symptôme typique du code qui n'est pas multi-thread sûr ... –

+0

Merci Cedric. Voyez-vous quelque chose de spécifique à TestNG que je fais mal? – nilesh

Questions connexes