2014-04-29 3 views
7

Voglio capire meglio come Tomcat gestisce le richieste e perché il mio problema specifico potrebbe accadere.Tomcat EOFException: lettura EOF imprevista sulla presa

Sto cercando di migliorare la mia applicazione Web Spring MVC esistente con il framework Netflix Hystrix. Ciò comporta l'aggiunta di un servlet specifico di hystrix per gestire le richieste che terminano con /hystrix.stream.

In base ai registri (sotto), questa mappatura funziona e la richiesta viene inoltrata al servlet corretto. Tuttavia, l'eccezione che viene generata non si verifica nel servlet. Ho anche provato ad estendere il servlet per aggiungere logging aggiuntivo - ma sembra che nessun metodo nel servlet sia stato chiamato. Sembra che l'eccezione stia accadendo a causa di un lavoro interiore su Tomcat di cui non sono a conoscenza.

Ecco un frammento del mio web.xml (si noti che il resto della mia applicazione funziona bene - questo è solo relative alla richiesta di /hystrix.stream):

<servlet> 
    <display-name>HystrixMetricsStreamServlet</display-name> 
    <servlet-name>HystrixMetricsStreamServlet</servlet-name> 
    <servlet-class>com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>HystrixMetricsStreamServlet</servlet-name> 
    <url-pattern>/hystrix.stream</url-pattern> 
</servlet-mapping> 

Se navigando nelle loalhost: 8080 /web-app/hystrix.stream Sono inoltrato all'errore Tomcat 404. La seguente eccezione appare nel file di registro di tomcat:

2014-04-16 15:53:22 DEBUG AuthenticatorBase:419 - Security checking request GET /web-app/hystrix.stream 
2014-04-16 15:53:22 DEBUG WebappClassLoader:1582 - loadClass(com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet, false) 
2014-04-16 15:53:22 DEBUG WebappClassLoader:1598 - Returning class from cache 
2014-04-16 15:53:22 DEBUG RealmBase:617 - No applicable constraints defined 
2014-04-16 15:53:22 DEBUG AuthenticatorBase:501 - Not subject to any constraint 
2014-04-16 15:53:22 DEBUG [localhost]:449 - Processing ErrorPage[errorCode=404, location=/404.htm] 
2014-04-16 15:53:22 DEBUG Http11Processor:986 - Error parsing HTTP request header 
java.io.EOFException: Unexpected EOF read on the socket 
      at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:99) 
      at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:952) 
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
      at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
      at java.lang.Thread.run(Unknown Source) 

2014-04-16 15:53:22 DEBUG Http11Protocol:645 - Socket: [[email protected]:129bf96a[TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: Socket[addr=/0:0:0:0:0:0:0:1,port=53783,localport=8443]]], Status in: [OPEN_READ], State out: [CLOSED] 
2014-04-16 15:53:22 DEBUG LimitLatch:126 - Counting down[http-bio-8443-exec-1] latch=4 
2014-04-16 15:53:22 DEBUG Http11Processor:986 - Error parsing HTTP request header 
java.io.EOFException: Unexpected EOF read on the socket 
      at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:99) 
      at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:952) 
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
      at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
      at java.lang.Thread.run(Unknown Source) 

Qualcuno ha riscontrato qualcosa di simile prima? Come ho già detto, la mia applicazione funziona bene - questo si verifica solo per /hystrix.stream. Ho usato il plugin Chrome Postman per aggiungere gli header Accept e Content-Type = application/json alla richiesta, entrambi senza successo. Per quanto ne so, le richieste a questo servlet non hanno requisiti di intestazione

Grazie per l'aiuto.

+0

Io non so niente di Netflix Hystrix, ma sembra che il problema è più probabile che il client stia uccidendo la connessione o inviando qualcosa che il server non capisce causando la sua interruzione della connessione. Vorrei iniziare da lì. – CodeChimp

+0

ottiene questo nei registri di un progetto Grails. Tutto funziona bene però ..... – froderik

risposta

1

messaggio di emissione è molto chiaro, la tua testa richiesta non è corrent.

 byte chr = 0; 
    do { 

     // Read new bytes if needed 
     if (pos >= lastValid) { 
      if (!fill())//read request content 
       throw new EOFException(sm.getString("iib.eof.error")); 
     } 
     // Set the start time once we start reading data (even if it is 
     // just skipping blank lines) 
     if (request.getStartTime() < 0) { 
      request.setStartTime(System.currentTimeMillis()); 
     } 
     chr = buf[pos++]; 
    } while ((chr == Constants.CR) || (chr == Constants.LF)); 

sopra è il codice sorgente di Tomcat in InternalInputBuffer.parseRequestLine - *. la prima volta durante la funzione si leggerà il contenuto (8 * 1024). [di solito l'intestazione non sarà così a lungo]


  • *. dopo aver letto il contenuto richiesta, il codice sarà controllare il primo charactor di '\ r \ n'

  • *. quindi se il vostro tenore di richiesta non verrà contiene questo charactors, sarà un'eccezione EOF tiro

  • *. quindi l'header paser è faill, quindi il web container non conosce il metodo Servlet, quindi il tuo servlet non verrà chiamato.

penso che il server è ok, il problema è apparso in Chrome Postman plug-in, si prega di controllare l'intestazione