我在我的应用中使用javax.websocket API。我将消息从服务器发送到客户端,如下所示:
Future<Void> messageFuture = session.getAsyncRemote().sendText(message);
messageFutures.add(messageFuture); // List<Future<Void>> messageFutures
我使用异步API,因为我真的非常关心性能,并且无法让服务器等到每个消息都交付,因为服务器确实像这样:
for (i = 1..N) {
result = doStuff()
sendMessage(result)
}
所以每次迭代都不可能等待消息传递。
发送所有消息后,我需要等待所有Future
完成(所有消息都已发送)。为了安全起见,我需要使用一些超时,例如“如果服务器向客户端发送消息,客户端在30秒内未确认收到,则认为websocket连接已断开” - 据我所知,应该可以使用websockets,因为他们可以通过TCP工作。
有一种方法session.setMaxIdleTimeout(long)
:
设置此会话之前的非零毫秒数 如果容器处于非活动状态,则由容器关闭,即也没有消息 发送或接收。值为0或负值表示会话 由于不活动而永远不会超时。
但我真的不确定这是不是我想要的(是吗?)。那么如何设置一个超时,就像我用javax.websocket API描述的那样?
答案 0 :(得分:1)
空闲超时可以覆盖您的情况,但它不是为了设计的。空闲超时更多地适用于客户端建立连接但仅偶尔使用它的情况。
发送时检查超时的更精确功能是setAsyncSendTimeout
。
使用这两者允许您配置客户端可以一次空闲连接几分钟的情况,但服务器需要相对快速的消息确认。
根据我使用Spring的经验,Spring提供的超时实现实际上不是可配置的。请参阅How do you quickly close a nonresponsive websocket in Java Spring Tomcat?我不确定这是否适用于您的websocket实现。