使用Apache Wicket和嵌入式Jetty的Websocket超时
我将Wicket与嵌入式Jetty Web服务器一起使用。应用程序正在使用WebSocket,因此Jetty设置如下所示:使用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
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不再得到通知