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.
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
ottiene questo nei registri di un progetto Grails. Tutto funziona bene però ..... – froderik