javax.websocket - 传递消息的超时

时间:2017-01-05 16:17:03

标签: java websocket

我在我的应用中使用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描述的那样?

1 个答案:

答案 0 :(得分:1)

空闲超时可以覆盖您的情况,但它不是为了设计的。空闲超时更多地适用于客户端建立连接但仅偶尔使用它的情况。

发送时检查超时的更精确功能是setAsyncSendTimeout

使用这两者允许您配置客户端可以一次空闲连接几分钟的情况,但服务器需要相对快速的消息确认。

根据我使用Spring的经验,Spring提供的超时实现实际上不是可配置的。请参阅How do you quickly close a nonresponsive websocket in Java Spring Tomcat?我不确定这是否适用于您的websocket实现。