Jetty 11:以编程方式和通过配置文件设置 WebSocket 的空闲超时

问题描述 投票:0回答:1

我找到了一种通过在

factory.setIdleTimeout
方法的实现中调用
JettyWebSocketServlet.configure(JettyWebSocketServletFactory factory)
以编程方式设置 Jetty 11 WebSocket 连接的空闲超时的方法。我想知道……

  • 如果这是推荐的方法,并且
  • 超时值是否可以外部化,例如通过 XML 配置文件?看来,以下解决方案不适用于 WebSockets:
<!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 java-websocket jetty-11
1个回答
0
投票

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");
© www.soinside.com 2019 - 2024. All rights reserved.