【问题标题】:Jetty, DefaultServlet, BlockingCallback and TimeoutException issueJetty、DefaultServlet、BlockingCallback 和 TimeoutException 问题
【发布时间】:2013-12-13 00:05:25
【问题描述】:

我正在运行一个由 Jetty 9.1.0.RC1(独立发行版)提供支持的在线应用程序。

在提供静态内容(.js、.css、.png 文件等)时,以下随机出现的问题填满了我的日志文件:

2013-11-25 07:43:37.351:WARN:oejs.ServletHandler:qtp1207851091-422: /scripts/shared/channel/channel.public.js
java.io.IOException: java.util.concurrent.TimeoutException: Idle timeout expired: 75000/75000 ms
    at org.eclipse.jetty.util.BlockingCallback.block(BlockingCallback.java:101)
    at org.eclipse.jetty.server.HttpOutput.sendContent(HttpOutput.java:490)
    at org.eclipse.jetty.servlet.DefaultServlet.sendData(DefaultServlet.java:893)
    at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:499)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:696)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1566)
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:164)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1537)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:524)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:568)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1110)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:453)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1044)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:200)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:442)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:279)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:213)
    at org.eclipse.jetty.io.AbstractConnection$1.run(AbstractConnection.java:505)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
    at java.lang.Thread.run(Thread.java:722)
Caused by: 
java.util.concurrent.TimeoutException: Idle timeout expired: 75000/75000 ms
    at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:153)
    at org.eclipse.jetty.io.IdleTimeout$1.run(IdleTimeout.java:50)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
    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:722)

同样适用于以下资源:

2013-11-26 15:09:01.219:WARN:oejs.ServletHandler:qtp1207851091-629: /Resources/Audio/IncomingMessage.wav

2013-11-25 03:02:44.904:WARN:oejs.ServletHandler:qtp1207851091-408: /Resources/Website/Users/f3c68328-d739-4680-8144-a0db598dff6b/1384157586003.png

我正在使用 servlet 3.0。有两个 DefaultServlet 的实例,一个来自 webdefault.xml,另一个来自 web.xml,用于提供用户图像(不与 .war 文件捆绑)。

前一个DefaultServlet的配置没有修改,后一个如下:

<servlet>
    <servlet-name>DefaultImagesServlet</servlet-name>
    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
    <init-param>
        <param-name>resourceBase</param-name>
        <param-value>/echat/static/</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>DefaultImagesServlet</servlet-name>
    <url-pattern>/Resources/*</url-pattern>
</servlet-mapping>

我花了 3 天时间试图弄清楚这件事,但仍然卡住了。我没有在应用程序的任何地方显式使用 Continuation。

此问题仅在码头(重新)启动后几天出现。

任何线索到哪里寻找答案?看来我已经用尽了所有可能的选择。

亲切的问候,

迈克尔·齐斯科夫斯基

【问题讨论】:

    标签: java jetty servlet-3.0 continuation


    【解决方案1】:

    第二个 DefaultServlet 应该还有 1 个 init-param ...

    <servlet>
        <servlet-name>DefaultImagesServlet</servlet-name>
        <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
        <init-param>
            <param-name>resourceBase</param-name>
            <param-value>/echat/static/</param-value>
        </init-param>
        <init-param>
            <param-name>pathInfoOnly</param-name> <!-- this should be set -->
            <param-value>true</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DefaultImagesServlet</servlet-name>
        <url-pattern>/Resources/*</url-pattern>
    </servlet-mapping>
    

    您看到的空闲超时来自活动(未关闭)连接,在一段时间内没有任何事情发生。

    此外,您应该捕获 HTTP 流量,发出的请求与返回的内容可能存在问题。了解请求/响应标头是HTTP/1.0keep-alive 状态,还是HTTP/1.1 和错误Connection 状态尤其重要。

    要做的另一件事是在测试时在调试级别启用以下日志记录(如果在 Jetty 本身中使用备用 StdErrLog 日志记录)。

    System.setProperty("org.eclipse.jetty.servlet.LEVEL","DEBUG");
    

    这将显示正在请求的资源,以及试图在磁盘上找到的资源。

    示例:假设您的问题中有 DefaultImagesServlet 的原始配置。

    /Resources/scripts/main.js 的请求将在您的文件系统上查找文件为/echat/static/Resources/scripts/main.js。此行为与映射到路径规范 "/" 的 servlet 规范 "default"(命名)servlet 行为的特殊要求一致。

    使用pathInfoOnly 设置,对/Resources/scripts/main.js 的请求将从/echat/static/scripts/main.js 的文件系统中提取,这与普通Servlet 的行为方式更加一致。

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2012-03-04
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多