我找到了一种通过在
factory.setIdleTimeout
方法的实现中调用 JettyWebSocketServlet.configure(JettyWebSocketServletFactory factory)
以编程方式设置 Jetty 11 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>
websocket 上没有空闲超时的配置文件。
在 Jetty 12 ...
如果使用
jakarta.websocket
API,则默认空闲超时来自容器中的 jakarta.websocket.Session.getMaxIdleTimeout()
。
对于 Jetty 12 上的
ee10
环境,org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketSession
处理 jakarta.websocket.Session
上 ee10
的容器。
ee10
环境委托给jetty-core(没有servlet功能)org.eclipse.jetty.websocket.core.CoreSession
类,跟踪30秒的默认空闲超时。
jetty-core
org.eclipse.jetty.websocket.core.Configuration
能够使用API获取/设置空闲超时。
Duration Configuration.getIdleTimeout()
void Configuration.setIdleTimeout(Duration)
Duration Configuration.getWriteTimeout()
void Configuration.setWriteTimeout(Duration)
但这些不是由配置文件、inis 或 xml 设置的。
不过,这些可以在嵌入式场景中访问。
如果您使用 Jetty WebSocket API,则可以在
org.eclipse.jetty.websocket.api.Configurable
处设置容器特定的空闲超时。 但是从 Servlet Web 应用程序访问它有点棘手,但如果您是嵌入式的,那没什么大不了的。
import import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer;
ServletContextHandler contextHandler = new ServletContextHandler();
JettyWebSocketServletContainerInitializer
.configure(contextHandler, (servletContext, wsContainer) ->
{
wsContainer.setIdleTimeout(Duration.ofSeconds(30));
wsContainer.addMapping("/echo", EchoEndpoint.class);
});
wsContainer
参数返回的对象是org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServerContainer
类型,它实现了org.eclipse.jetty.websocket.api.Configurable
。
在基于
ee10
Servlet 的 Web 应用程序(基于 org.eclipse.jetty.ee10.webapp.WebAppContext
或 org.eclipse.jetty.ee10.servlet.ServletContextHandler
)中,从 ServletContext
本身的角度来看,您有 2 个选项来配置空闲超时。
首先您可以手动添加过滤器
org.eclipse.jetty.ee10.websocket.servlet.WebSocketUpgradeFilter
,然后使用idleTimeout
初始化参数。
这将为映射到 WebSocketUpgradeFilter 的所有端点定义默认空闲超时。
这就是它在嵌入模式下的工作方式。在
WEB-INF/web.xml
中使用相同的 init-param
import org.eclipse.jetty.ee10.websocket.servlet.WebSocketUpgradeFilter;
FilterHolder filterHolder = new FilterHolder(WebSocketUpgradeFilter.class);
filterHolder.setName(WebSocketUpgradeFilter.class.getName());
filterHolder.setInitParameter("idleTimeout", idleTimeoutFilter1);
contextHandler.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
其次,您可以手动添加您拥有的
org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet
servlet,并使用 idleTimeout
初始化参数。
这将仅为该 servlet 定义默认的空闲超时,无论它映射到多少个
<url-pattern>
条目。
这就是它在嵌入模式下的工作方式。在
WEB-INF/web.xml
中使用相同的初始化参数
import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet;
public static class EchoServlet extends JettyWebSocketServlet {
/* ... implementation here ... */
}
ServletHolder wsHolder = new ServletHolder("wsecho", EchoServlet.class);
wsHolder.setInitParameter("idleTimeout", "30");
contextHandler.addServlet(wsHolder, "/echo");