【问题标题】:javax.websocket - timeout for delivering messagejavax.websocket - 传递消息超时
【发布时间】:2017-05-20 06:34:47
【问题描述】:

我在我的应用程序中使用 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 描述的那样设置超时?

【问题讨论】:

    标签: java websocket


    【解决方案1】:

    空闲超时可以涵盖您的情况,但它并非旨在。空闲超时更适用于客户端建立连接但很少使用它的情况。

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

    同时使用这两种方法可以让您针对客户端可能一次使连接空闲几分钟但服务器期望相对快速的消息确认的情况进行配置。


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

    【讨论】:

    • 谢谢!似乎这正是我所需要的,像ContainerProvider.getWebSocketContainer().setAsyncSendTimeout(30_000) 这样的东西应该做的事情。幸运的是(或不是)我的应用不是基于 Spring 构建的
    猜你喜欢
    • 2021-12-02
    • 2014-09-26
    • 1970-01-01
    • 2013-04-09
    • 2015-08-05
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多