【发布时间】:2014-06-15 02:23:36
【问题描述】:
我想更好地了解 Tomcat 如何处理请求以及为什么会出现我的具体问题。
我正在尝试使用 Netflix Hystrix 框架来增强我现有的 Spring MVC Web 应用程序。这涉及添加一个特定于 hystrix 的 servlet 来处理以 /hystrix.stream 结尾的请求。
根据日志(如下),此映射有效并且请求被转发到正确的 servlet。但是,抛出的异常不会发生在 servlet 中。我也尝试过扩展 servlet 以添加额外的日志记录 - 但似乎没有调用 servlet 中的方法。似乎发生了异常,因为我不知道在 Tomcat 上进行了一些内部工作。
这是我的 web.xml 中的一个 sn-p(请注意,我的应用程序的其余部分工作正常 - 这只是关于 /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>
当我导航到 loalhost:8080/web-app/hystrix.stream 时,我被转发到 Tomcat 404 错误。在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: [org.apache.tomcat.util.net.SocketWrapper@56a7cbf2: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)
有没有人遇到过这样的事情?正如我所提到的,我的应用程序运行良好——这只发生在 /hystrix.stream 中。我使用 Chrome Postman 插件将 Accept 和 Content-Type = application/json 标头添加到请求中 - 均未成功。据我所知,对这个 servlet 的请求没有任何标头要求
感谢您的帮助。
【问题讨论】:
-
我对Netflix Hystrix一无所知,但似乎问题很可能是客户端正在终止连接或发送服务器不理解的内容导致它终止连接。我会从那里开始。
-
在 grails 项目的日志中获取此信息。一切都很好......
标签: java tomcat spring-mvc servlets