2011-11-27 1 views
1

J'essaie d'accéder au site Web uniprot pour récupérer une liste de séquences de protéines avec leurs profils en tant que fichier XML. La taille du fichier est énorme. J'utilise l'éclipse qui vient avec le paquet complet de JBPM. En outre, j'utilise ubuntu sous la boîte virtuelle. Maintenant, quand je lance mon code, je reçois ce stacktrace:Besoin de résoudre ce: java.io.IOException: EAT prématuré

java.io.IOException: Premature EOF 
    at sun.net.www.http.ChunkedInputStream.fastRead(ChunkedInputStream.java:234) 
    at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:662) 
    at java.io.FilterInputStream.read(FilterInputStream.java:116) 
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2512) 
    at edu.uga.uniprot.amna.QueryExecuter.ExecuteQuery(QueryExecuter.java:40) 
    at edu.uga.uniprot.amna.Uniprot.getProteenStringByDFamily(Uniprot.java:40) 
    at edu.uga.uniprot.amna.Uniprot.getProteensByDFamily(Uniprot.java:55) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0.action4(Process_org_drools_bpmn2_Hello_World_0.java:60) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0Action4Invoker.execute(Process_org_drools_bpmn2_Hello_World_0Action4Invoker.java:14) 
    at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:47) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerConnection(NodeInstanceImpl.java:185) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:150) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:49) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:41) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35) 
    at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:188) 
    at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:302) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:154) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:124) 
    at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1095) 
    at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:306) 
    at com.sample.ProcessTest.main(ProcessTest.java:49) 
java.lang.RuntimeException: unable to execute Action 
    at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:49) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerConnection(NodeInstanceImpl.java:185) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:150) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:49) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:41) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35) 
    at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:188) 
    at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:302) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:154) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:124) 
    at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1095) 
    at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:306) 
    at com.sample.ProcessTest.main(ProcessTest.java:49) 
Caused by: java.lang.NullPointerException 
    at java.io.StringReader.<init>(StringReader.java:33) 
    at edu.uga.uniprot.amna.Uniprot.loadProteenFromString(Uniprot.java:117) 
    at edu.uga.uniprot.amna.Uniprot.getProteensByDFamily(Uniprot.java:58) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0.action4(Process_org_drools_bpmn2_Hello_World_0.java:60) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0Action4Invoker.execute(Process_org_drools_bpmn2_Hello_World_0Action4Invoker.java:14) 
    at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:47) 
    ... 14 more 

que peut aider comment résoudre cette erreur ou quelle cause de cela?

Voici le code qui génère l'erreur:

public static String ExecuteQuery(String queryURL, boolean writeFile) { 

    URL url; 

    try { 

     System.out.println("Strat getting Data"); 

     String output = ""; 

     int read; 

     RandomAccessFile file = null; 

     url = new URL(queryURL); 

     HttpURLConnection connection = 

       (HttpURLConnection) url.openConnection(); 



     connection.setRequestProperty("Content-Type", "application/xml"); 

     connection.connect();  



     //read the result from the server 

     if(writeFile == true) { 

      file = new RandomAccessFile(fileName, "rw"); 

     } 

     InputStream stream = connection.getInputStream(); 

     byte[] buffer = new byte[1024]; 

     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 



     while((read = stream.read(buffer, 0, 1024)) != -1) { 

      //System.out.println(new String(buffer)); 

      output = output + new String(buffer).substring(0, read); 

      if(writeFile == true) { 

       file.write(buffer, 0, read); 

      } 

      buffer = new byte[1024]; 

     } 

     System.out.println(output); 

     return output; 

    } catch (MalformedURLException e) { 

     // TODO Auto-generated catch block 

     e.printStackTrace(); 

    } catch (IOException e) { 

     // TODO Auto-generated catch block 

     e.printStackTrace(); 

    } 

    return null; 

} 
+0

Que diriez-vous de certains des codes de Java ??? – Michael

+0

Vous n'avez pas besoin d'allouer une nouvelle mémoire tampon à chaque fois autour de cette boucle, c'est-à-dire que la GC est vouée à la mort. Vous pourriez réécrire avec profit 'new String (buffer) .substring (0, read)' comme 'new String (buffer, 0, read)' aussi. – EJP

Répondre

-1

J'ai finalement résolu le problème qui semble être arrivé à cause de la lecture rapide avec une connexion lente. une fois que j'ai ajouté un System.out.println(new String(buffer)) cela fonctionne bien.

L'instruction printlnralentit l'opération de lecture et la rend compatible avec la vitesse de connexion.

Je souhaite que ceci soit utile à n'importe qui face au même problème.

+1

Explication peu convaincante. Votre code de lecture ne peut pas courir plus vite que les données arrivent: il bloque lorsqu'il n'y a pas de données. – EJP

+0

EJP J'ai posté cette question et personne n'a donné une solution raisonnable parce que l'erreur "prématurée EOF" bizarre. Donc, si vous ne pouvez pas croire cette solution s'il vous plaît laissez-moi savoir comment résoudre le problème, le code est déjà posté, allez-y et exécutez-le. – thinkBig

+3

Je n'ai pas dit que je connaissais la solution, j'ai dit que votre explication n'est pas convaincante. En d'autres termes, vous ne connaissez pas encore la solution. Vous n'avez pas résolu le problème: vous venez de le déplacer ou de le différer. – EJP

1

Cette erreur est causée par vous faire passer une valeur nulle dans le nouveau StringReader() à la ligne 117 de Uniprot.java.

Vous pouvez voir cela en votre stacktrace:

Caused by: java.lang.NullPointerException 
    at java.io.StringReader.<init>(StringReader.java:33) 
    at edu.uga.uniprot.amna.Uniprot.loadProteenFromString(Uniprot.java:117) 
    at edu.uga.uniprot.amna.Uniprot.getProteensByDFamily(Uniprot.java:58) 

Le constructeur de StringReader est le suivant:

public StringReader(String s) { 
    this.str = s; 
    this.length = s.length(); // line 33 
} 

Voir plus StringReader.

+0

Merci pour répondre mon pote, mais je pose des questions sur l'exception java.io.IOException: EOF prématuré qui provoque la valeur nulle plus tard. – thinkBig

+1

Est-ce une exception, ou deux exceptions? Si c'est deux, alors vous devez poster votre code afin que nous puissions le voir. edu.uga.uniprot.amna.QueryExecuter.ExecuteQuery de préférence –

+0

Je viens d'ajouter le code. – thinkBig

1

Si vous tentez de télécharger un grand nombre d'entrées uniprot dans une connexion http, la connexion HTTP risque de mourir. Je suggère que vous jetez un oeil à http://www.uniprot.org/faq/28#retrieving_entries_via_queries et utilisez les paramètres de décalage et de limite sur votre demande http pour limiter le nombre d'entrées que vous essayez de récupérer en une seule fois.

La requête http dynamique a tendance à échouer lors du téléchargement de jeux de résultats très volumineux. L'autre option est de télécharger toutes les entrées via ftp et de travailler sur le fichier de téléchargement. Voir le UniProt FTP site

Questions connexes