如何配置嵌入式Jetty的Idle Timeout(请求超时)以解决超时异常
嵌入式Jetty Idle Timeout(请求超时)配置方法
你遇到的异常是Jetty默认30秒空闲超时触发的,以下是几种修改该超时时间的配置方式:
触发异常信息:
java.util.concurrent.TimeoutException: Idle timeout expired: 30002/30000 ms at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:167) at org.eclipse.jetty.io.IdleTimeout.idleCheck(IdleTimeout.java:113) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1589)
1. 全局Connector层面配置(推荐)
修改Connector的空闲超时参数,对所有通过该Connector处理的请求生效:
// 初始化Jetty Server Server server = new Server(); // 配置HTTP参数,设置空闲超时为60秒(单位:毫秒) HttpConfiguration httpConfig = new HttpConfiguration(); httpConfig.setIdleTimeout(60000); // 创建HTTP连接工厂并关联配置 HttpConnectionFactory httpConnFactory = new HttpConnectionFactory(httpConfig); // 创建ServerConnector并绑定端口 ServerConnector connector = new ServerConnector(server, httpConnFactory); connector.setPort(8080); // 将Connector添加到Server实例 server.addConnector(connector); // 后续添加Servlet、Handler等业务配置...
2. 特定Servlet/Handler单独配置
如果仅需给某个Servlet或Handler设置自定义超时,可通过上下文属性配置:
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); // 给当前上下文设置60秒空闲超时 context.getServletContext().setAttribute("org.eclipse.jetty.server.HttpConnection.idleTimeout", 60000); // 添加自定义Servlet context.addServlet(new ServletHolder(new MyCustomServlet()), "/api/*"); server.setHandler(context);
3. XML配置方式(若用XML初始化嵌入式Jetty)
通过XML配置文件修改Connector的空闲超时:
<Configure id="Server" class="org.eclipse.jetty.server.Server"> <Call name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"><Ref refid="Server"/></Arg> <Arg> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg> <New class="org.eclipse.jetty.server.HttpConfiguration"> <!-- 设置空闲超时为60秒 --> <Set name="idleTimeout">60000</Set> </New> </Arg> </New> </Item> </Array> </Arg> <Set name="port">8080</Set> </New> </Arg> </Call> </Configure>
内容的提问来源于stack exchange,提问作者apflieger
相关产品推荐
相关产品推荐

