2013-11-27 22 views
0

我正在运行由Jetty 9.1.0.RC1(独立分发)支持的在线应用程序。Jetty,DefaultServlet,BlockingCallback和TimeoutException问题

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) 

这同样适用于资源,如:

我的日志文件被由下列问题随机存在的提供静态内容(.js文件,名为.css,.png文件等)时,填补了

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。

这个问题只发生在码头重新启动后的几天。

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

亲切的问候,

迈克尔Zyskowski

回答

0

第二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"(named)在"/"的路径规范处映射的servlet行为的特殊要求。

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