使用Apache Wicket和嵌入式Jetty的Websocket超时

使用Apache Wicket和嵌入式Jetty的Websocket超时,websocket,wicket,embedded-jetty,Websocket,Wicket,Embedded Jetty,我将Wicket与嵌入式Jetty Web服务器一起使用。应用程序正在使用WebSocket,因此Jetty设置如下所示: FilterHolder filterHolder = new FilterHolder(Jetty9WebSocketFilter.class); filterHolder.setInitParameter("applicationClassName", "MyApplication"); filterHolder.setInitParameter("filterMapp

我将Wicket与嵌入式Jetty Web服务器一起使用。应用程序正在使用WebSocket,因此Jetty设置如下所示:

FilterHolder filterHolder = new FilterHolder(Jetty9WebSocketFilter.class);
filterHolder.setInitParameter("applicationClassName", "MyApplication");
filterHolder.setInitParameter("filterMappingUrlPattern", "/*");

WebAppContext context = new WebAppContext();
context.setResourceBase(".");
context.addFilter(filterHolder, "/*", null);
context.addServlet(DefaultServlet.class, "/*");

Server server = new Server(8083);
server.setHandler(context);

try {
    server.start();
} catch (Exception e) {
    e.printStackTrace();
}
除了websocket超时外,一切正常。研究表明Jetty的websocket连接超时,尽管这在Web服务器中并不常见

在研究之后,我偶然发现了以下init参数,我现在将其传递给我的
过滤器文件夹

filterHolder.setInitParameter("maxIdleTime", "5000");
显然,这个参数做了些什么,因为现在超时发生的速度明显比以前快,正好在5秒之后

但我不知道如何完全禁用超时。使用
-1
0
甚至
Integer.MIN\u VALUE
而不是
5000
不起任何作用,但一段时间后仍有超时。我找到的文档中没有提到相应的值

我可以使用哪个init参数来禁用websocket超时?或者我必须坚持将超时设置为某个高得离谱的值吗?

Jetty 9.1有自己的设置,使用该设置,然后修改默认策略的空闲超时

例如:

package jetty.websocket;
导入org.eclipse.jetty.server.server;
导入org.eclipse.jetty.server.ServerConnector;
导入org.eclipse.jetty.servlet.DefaultServlet;
导入org.eclipse.jetty.servlet.ServletContextHandler;
导入org.eclipse.jetty.servlet.ServletHolder;
导入org.eclipse.jetty.websocket.api.Session;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
导入org.eclipse.jetty.websocket.api.annotations.websocket;
导入org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter;
导入org.eclipse.jetty.websocket.server.pathmap.ServletPathSpec;
导入org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
导入org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
导入org.eclipse.jetty.websocket.servlet.WebSocketCreator;
公共类JettyWebSocketViaFilter
{
@网袋
公共静态类EchoSocket
{
@OnWebSocketMessage
公共void onMessage(会话,字符串msg)
{
session.getRemote().sendStringByFuture(msg);
}
}
公共静态类EchoCreator实现WebSocketCreator
{
私有EchoSocket echoer=新EchoSocket();
@凌驾
公共对象createWebSocket(ServletUpgradeRequest请求、ServletUpgradeResponse响应)
{
回波;
}
}
公共静态void main(字符串[]args)
{
服务器=新服务器();
ServerConnector连接器=新的ServerConnector(服务器);
连接器。设置端口(8080);
addConnector(连接器);
//在“/”处为此应用程序设置基本应用程序“上下文”
//这也称为处理程序树(在jetty中)
ServletContextHandler上下文=新的ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(“/”);
setHandler(上下文);
//添加websocket过滤器
WebSocketUpgradeFilter wsfilter=WebSocketUpgradeFilter.configureContext(上下文);
wsfilter.getFactory().getPolicy().setIdleTimeout(5000);
addMapping(新的ServletPathSpec(“/”),新的EchoCreator();
//我们将映射的文件系统路径
String staticRoot=“src/main/webapp/websocket/protocol”;
ServletHolder-holderDefault=newservletholder(“default”,DefaultServlet.class);
setInitParameter(“resourceBase”,staticRoot);
setInitParameter(“dirAllowed”、“true”);
addServlet(holderDefault,“/”);
尝试
{
server.start();
join();
}
捕获(可丢弃的t)
{
t、 printStackTrace(System.err);
}
}
}
带有WebSocket的码头超时:

由于WebSocket是一个升级的HTTP/1.1请求,因此您基本上需要担心两个超时

第一个是连接器空闲超时,它将用于传入升级请求的HTTP/1.1初始部分。这是在服务器级别配置的,带有它所具有的连接器。对于Jetty,任何值0或以下都被视为无限超时

接下来,您将看到websocket端点特定的空闲超时。如果其值大于0,则应用于已建立连接的空闲超时(来自服务器端的超时)

一些组合和它的意思

Server Connector IdleTimeout | WebSocket端点IdleTimeout |实际超时
------------------------------+--------------------------------+----------------
30000毫秒-1 30000毫秒
30000毫秒| 10000毫秒| 10000毫秒
30000毫秒| 400000毫秒| 400000毫秒
500000毫秒-1 500000毫秒
500000毫秒| 200毫秒| 200毫秒
-1 |-1 |(无限)
-1 | 1000毫秒| 1000毫秒
您可以将服务器连接器IdleTimeout视为TCP级别的超时,而WebSocket端点超时是应用程序级别的空闲超时


希望这能有所帮助。

继续,让Wicket知道这个过滤器。。。我使用了您的代码,包括类
EchoSocket
EchoCreator
,但我的wicket应用程序现在不知道已打开的web套接字连接。在我当前的wicket页面上有一个
WebSocketBehavior
,以前在打开websocket连接时收到通知。现在调用了
EchoCreator
createWebSocket
方法,但是wicket不再得到通知