Jetty 11:通过编程及配置文件设置WebSocket空闲超时
Jetty 11 WebSocket空闲超时配置问题解答
1. 编程式设置是否为推荐方案
是,这是Jetty官方推荐的针对WebSocket连接层级设置空闲超时的方案。
- 原因在于:WebSocket有自身的会话管理和Ping/Pong心跳机制,
JettyWebSocketServletFactory.setIdleTimeout()是直接作用于WebSocket会话的超时控制,能精准匹配WebSocket的业务场景;而底层ServerConnector的idleTimeout是针对TCP连接的全局设置,和WebSocket会话的超时逻辑并不完全对齐。 - 这种方式也能让你在代码中灵活根据不同WebSocket端点设置不同的超时值,适配多场景需求。
2. 能否通过XML外部化配置?
可以,但你提供的XML配置无效,因为你设置的是ServerConnector的idleTimeout,这是底层TCP连接的超时,不属于WebSocket会话的超时配置。以下是两种有效的XML配置方式:
方式一:在web.xml中给WebSocketServlet添加初始化参数
如果你的WebSocket是通过JettyWebSocketServlet部署的,可以在web.xml中配置初始化参数,让Servlet自动读取并设置超时:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0"> <servlet> <servlet-name>MyWebSocketServlet</servlet-name> <servlet-class>com.example.MyWebSocketServlet</servlet-class> <!-- 设置WebSocket空闲超时,单位毫秒 --> <init-param> <param-name>idleTimeout</param-name> <param-value>90000</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MyWebSocketServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>
这种方式下,JettyWebSocketServlet会自动读取idleTimeout初始化参数,无需你在configure()方法中手动调用setIdleTimeout()。
方式二:在jetty.xml中配置JettyWebSocketServletFactory
如果需要全局配置WebSocket超时,也可以通过Jetty的Configure文件直接配置工厂类:
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> <Configure class="org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory"> <!-- 设置WebSocket空闲超时,单位毫秒 --> <Set name="idleTimeout">90000</Set> </Configure>
注意要确保这个配置能关联到你的WebSocketServlet实例,通常需要配合上下文配置一起使用。
你之前的无效配置对比
你之前的配置是针对ServerConnector的,仅作用于TCP连接,不影响WebSocket会话:
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> <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> <Set name="idleTimeout">90000</Set> </New> </Arg> </Call> </Configure>
内容的提问来源于stack exchange,提问作者Christian Grün
相关产品推荐
相关产品推荐

