【问题标题】:Tomcat 7 stops receiving HTTP-requestsTomcat 7 停止接收 HTTP 请求
【发布时间】:2015-05-08 10:46:38
【问题描述】:

我有一个Tomcat 7 服务器接收大量GET 请求。这在一段时间内效果很好,然后突然停止工作(7-8 小时后)。

当它停止工作时,我收到此错误:

mai 06, 2015 12:47:58 AM org.apache.coyote.http11.AbstractHttp11Processor 进程 信息:解析 HTTP 请求标头时出错 注意:进一步出现的 HTTP 标头解析错误将记录在 DEBUG 级别。

在此之后的所有其他错误都是一样的。我试图停止获取请求,但无论如何它都会在一段时间后崩溃。你有什么想法吗?

这是在它崩溃之前:

[06/May/2015:10:47:11 +0200] "GET /ListenerServlet?request=getLastChanged&_=1430852558104 HTTP/1.1" 200 32

崩溃后:

[06/May/2015:10:47:14 +0200] "GET /ListenerServlet?request=getLastChanged&_=1430902035081 HTTP/1.1" 500 1674

崩溃后,Servlet无法获取请求参数..抛出这个空指针:

SEVERE: Servlet.service() for servlet [RoomServlet] in context with path [] threw exception java.lang.NullPointerException
        at factory.Factory.initEditMode(Factory.java:37)
        at factory.Factory.init(Factory.java:20)
        at factory.TabsFactory.<init>(TabsFactory.java:19)
        at servlet.RoomServlet.getTabs(RoomServlet.java:285)
        at servlet.RoomServlet.doGet(RoomServlet.java:46)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
        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(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

接着是:

mai 07, 2015 9:58:00 AM org.apache.catalina.core.StandardContext listenerStop
SEVERE: Exception sending context destroyed event to listener instance of class websocket.drawboard.DrawboardContextListener
java.lang.NoClassDefFoundError: javax/websocket/Endpoint
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2944)
        at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1208)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
        at websocket.drawboard.DrawboardContextListener.contextDestroyed(DrawboardContextListener.java:32)
        at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5014)
        at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5659)
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
        at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1575)
        at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1564)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: javax.websocket.Endpoint
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1718)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
        ... 17 more

如果我还有什么需要补充的,请告诉我!我真的很感激。

编辑:今天是个好日子,我遇到了一个新错误!这可能与 JDBC 有关系....

从服务器成功接收到的最后一个数据包是 33 921 291 毫秒前。最后一个成功发送到服务器的数据包是 1 毫秒前。连接关闭后不允许任何操作。

【问题讨论】:

  • 你试过更新tomcat版本了吗?也许这是一个错误。 (我遇到了一个问题,使用新版本的tomcat后解决了)
  • 我目前正在使用来自 apt-get 的 Tomcat Linux 版本。
  • 这可能是资源问题,因为您的应用程序正在使用 Web 套接字。有关详细信息,请参阅tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html。例如,您可能需要更改 Tomcat 配置以避免每个连接消耗一个线程来实现长连接。
  • @OleReidarHolm:这可能不是最新版本!
  • 你注意到了吗:java.lang.ClassNotFoundException: javax.websocket.Endpoint

标签: java apache http tomcat


【解决方案1】:

您可以尝试安装Apache Tomcat v7.0.53 或更高版本。

【讨论】:

  • 好的,我正在尝试使用最新的 Tomcat 版本(7.0.61)。我明天会知道它是否有效。谢谢
  • 请确保 websocket 库都在 classpath 中,以及它们的依赖关系。这似乎是一些请求上下文切换序列中出现的依赖问题
【解决方案2】:

可能你有文件描述符泄漏,可能导致类加载失败,你可以使用lsof检查打开了多少文件描述符。

【讨论】:

    【解决方案3】:

    我几乎是随机找到了解决方案。

    没有任何相关的:

    org.apache.coyote.http11.AbstractHttp11Processor 进程

    但这是一个 JDBC 问题.. 连接在 8 小时后关闭,因此我在 Servlet 中没有收到任何错误。

    我的解决方案是在我的应用程序的上下文中添加一些行:

    我补充说:

    url="jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true"
    dontTrackOpenResources="true"
    testWhileIdle="true"
    timeBetweenEvictionRunsMillis="300000"
    

    这是我现在的完整上下文:

    <Context>
      <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
                   maxActive="100" maxIdle="100" maxWait="30000"
                   username="test" password="bestpassword" 
                   driverClassName="com.mysql.jdbc.Driver"
                   url="jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true"
                   removeAbandoned="true" removeAbandonedTimeout="10"
                   factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                   fairQueue="true"
                   dontTrackOpenResources="true"
                   testWhileIdle="true"
                   timeBetweenEvictionRunsMillis="300000"
                   />
    </Context>
    

    我的服务器已经一个星期没有崩溃了,我相信它不会再崩溃了。

    【讨论】:

    • 与此相关后是否再次崩溃?
    • 你好@Riaan。自从我发布此问题以来已经 2 年零 6 个月,因此对此的诚实回答将是“我不知道”。既然您伸出手,那么根据我记得的内容来回答是公平的。我记得我们对服务器进行了几个月的测试,没有一次崩溃。解决方案有点麻烦。我永远不会推荐永不关闭的 JDBC 连接,但在这种情况下,这是我们唯一的解决方案。我不知道 Tomcat 是否找到了解决此问题的方法,但我相信如果你用谷歌搜索“jdbc 连接关闭 tomcat”,你会找到相关的东西。
    猜你喜欢
    • 2020-06-13
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多