Jetty 9.1 有自己的WebSocketUpgradeFilter,使用那个,然后修改默认策略的空闲超时。
例子:
package jetty.websocket;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter;
import org.eclipse.jetty.websocket.server.pathmap.ServletPathSpec;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
public class JettyWebSocketViaFilter
{
@WebSocket
public static class EchoSocket
{
@OnWebSocketMessage
public void onMessage(Session session, String msg)
{
session.getRemote().sendStringByFuture(msg);
}
}
public static class EchoCreator implements WebSocketCreator
{
private EchoSocket echoer = new EchoSocket();
@Override
public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp)
{
return echoer;
}
}
public static void main(String[] args)
{
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.addConnector(connector);
// Setup the basic application "context" for this application at "/"
// This is also known as the handler tree (in jetty speak)
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
// Add the websocket filter
WebSocketUpgradeFilter wsfilter = WebSocketUpgradeFilter.configureContext(context);
wsfilter.getFactory().getPolicy().setIdleTimeout(5000);
wsfilter.addMapping(new ServletPathSpec("/"),new EchoCreator());
// The filesystem paths we will map
String staticRoot = "src/main/webapp/websocket/protocol";
ServletHolder holderDefault = new ServletHolder("default",DefaultServlet.class);
holderDefault.setInitParameter("resourceBase",staticRoot);
holderDefault.setInitParameter("dirAllowed","true");
context.addServlet(holderDefault,"/");
try
{
server.start();
server.join();
}
catch (Throwable t)
{
t.printStackTrace(System.err);
}
}
}
使用 WebSocket 的 Jetty 超时:
由于 WebSocket 是升级后的 HTTP/1.1 请求,您基本上需要担心 2 个超时。
首先是连接器空闲超时,它将用于传入升级请求的 HTTP/1.1 初始部分。这是在服务器级别配置的,具有它所具有的连接器。使用 Jetty,任何 0 或以下的值都被视为无限超时。
接下来,您将获得特定于 websocket 端点的空闲超时。如果它的值大于 0,则应用于已建立连接的空闲超时(来自服务器端的超时)。
一些组合及其含义...
Server Connector IdleTimeout | WebSocket Endpoint IdleTimeout | Actual Timeout
------------------------------+--------------------------------+----------------
30,000 ms | -1 | 30,000 ms
30,000 ms | 10,000 ms | 10,000 ms
30,000 ms | 400,000 ms | 400,000 ms
500,000 ms | -1 | 500,000 ms
500,000 ms | 200 ms | 200 ms
-1 | -1 | (infinite)
-1 | 1,000 ms | 1,000 ms
您可以将服务器连接器 IdleTimeout 视为 TCP 级别的超时,而 WebSocket 端点超时是应用程序级别的空闲超时。
希望这会有所帮助。