【问题标题】:When does OnWebSocketClose fire in Jetty 9Jetty 9 中的 OnWebSocketClose 何时触发
【发布时间】:2026-01-03 18:10:02
【问题描述】:

我有一个简单的嵌入式 Jetty 9 websocket 服务器。我在带注释的 websocket 实现中有这样的方法:

@OnWebSocketClose
void onClose(int statusCode, String reason) {
    logger.info "Closed connection [${this}]"
    connectionManager.remove(this)
    Event closeEvent = commsEventFactory.buildCloseEvent(this, statusCode, reason)
    eventReceiver.postEvent(closeEvent)
}

我有一个 spock 测试,它使用 async-http-client 连接到服务器。我获得了成功的连接,并且可以来回发送消息。

但是,永远不会调用 onClose()(当我调用 async-http-client 的 websocket.close() 或 client.close() 时,甚至当测试 JVM 死机时)。

我预计当套接字的远端消失时 onClose 会立即触发。

【问题讨论】:

    标签: websocket jetty embedded-jetty


    【解决方案1】:

    onClose() 将触发以指示本地端 websocket 已将状态更改为关闭。

    这可能是由于:

    • 远程端点已收到正确的 websocket 关闭握手(也称为干净关闭)
    • 任何将尝试发出干净关闭(状态代码 1002)的协议违规(在解析或生成中)。注意:由于这种情况的性质,此关闭可能不是干净的关闭握手。
    • 连接超时,导致异常(非干净)关闭。 (状态代码 1006)
    • 套接字上的任何读取 I/O 异常,导致异常(非干净)关闭。 (状态代码 1006)
    • 套接字上的任何写入 I/O 异常,导致异常(非干净)关闭。 (状态代码 1006)

    【讨论】:

    • 谢谢乔金!这绝对是我对 onClose 何时应该触发的理解。但可悲的是,不是我所看到的。我漫不经心地想知道​​这是否是我的 Mint 机器上的本地网络中的某些东西,但我没有追求这个。从那以后我开始使用气氛,这似乎工作正常。
    • 你是对的。有一些密切的错误。 406449404991 最近是 fixed and delivered in Jetty 9.0.3.v20130506 请试试那个版本。
    • 如何使用 OnClose 方法重新连接?
    • @Alireza 听起来是一个很好的新问题主题,去问吧!
    最近更新 更多