You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vert.x 5 WebSocket客户端连接创建后立即关闭,疑似存在未文档化的破坏性变更

Vert.x 5 WebSocket客户端连接创建后立即关闭,疑似存在未文档化的破坏性变更

我完全理解你升级时遇到这种问题的挫败感——之前在4.5.21跑得好好的WebSocket逻辑,到5.0.4直接连完就断,确实头疼。结合你提供的代码和报错信息,我帮你梳理几个Vert.x 5中可能导致这个问题的关键点,以及对应的修复方案:

1. 修正closeHandler的签名适配Vert.x 5变更

Vert.x 5对WebSocket的closeHandler做了签名调整:V4中是无参的Handler<Void>,但V5中改为接收CloseEvent参数(包含关闭状态码和原因)。你当前的V5代码还是用旧写法,可能会触发隐式异常,进而导致连接被主动关闭。

2. 显式指定HTTP/1.1握手版本

Vert.x 5默认会优先尝试HTTP/2握手,但Coinbase的WebSocket Feed依赖HTTP/1.1完成WebSocket升级,所以需要在WebSocketConnectOptions里显式指定HTTP版本。

3. 调整ClosingTimeout为非零值

你设置了setClosingTimeout(0),在Vert.x 5中这个值的处理逻辑发生了变化——0可能被视为无效配置,导致连接管理逻辑异常,建议改为合理的非零值(比如30000)。

修复后的完整V5示例代码

fun exampleV5Fixed() {
    val vertxOptions = VertxOptions().setAddressResolverOptions(AddressResolverOptions().setOptResourceEnabled(false))
    val vertx = Vertx.vertx(vertxOptions)
    println("Creating WebSocket client...")

    val options = WebSocketClientOptions()
        .setTcpKeepAlive(true)
        .setClosingTimeout(30000) // 调整为非零值,适配V5逻辑
        .setMaxFrameSize(Int.MAX_VALUE)
        .setMaxMessageSize(Int.MAX_VALUE)
        .setTrustAll(true)
        .setVerifyHost(false)
        .setConnectTimeout(30000)
    println("WebSocket client options configured")

    val connectOptions = WebSocketConnectOptions()
        .setAbsoluteURI("wss://ws-feed.exchange.coinbase.com")
        .setFollowRedirects(true)
        .setConnectTimeout(30_000)
        .setVersion(WebSocketVersion.V13)
        .setHttpVersion(HttpVersion.HTTP_1_1) // 显式指定HTTP/1.1握手
    val client = vertx.createWebSocketClient(options)

    client.connect(connectOptions)
        .onSuccess { ws -> // 重命名变量避免混淆handler概念
            println("WebSocket connected successfully!")
            // 适配V5的CloseEvent参数,获取关闭详情
            ws.closeHandler { event ->
                println("WebSocket closed with code ${event.statusCode()}, reason: ${event.reason()}")
            }
            ws.exceptionHandler { ex ->
                println("WebSocket exception: ${ex.message}")
                ex.printStackTrace()
            }
            ws.handler { message ->
                println("Received: $message")
            }
            // Wait a bit before sending subscription
            vertx.setTimer(2000) {
                println("Sending test subscription...")
                val subscriptionMsg = """{"type":"subscribe","channels":["ticker"],"product_ids":["BTC-USD"]}"""
                ws.writeTextMessage(subscriptionMsg)
                println("Test subscription sent: $subscriptionMsg")
            }
        }
        .onFailure { ex ->
            println("Connection failed: ${ex.message}")
            ex.printStackTrace()
        }
}

额外排查建议

  • 开启DEBUG级日志:把io.vertx.core.http的日志级别设为DEBUG,能看到WebSocket握手的完整过程(比如响应状态码、头信息),快速定位是否是握手阶段出了问题。
  • 统一配置优先级:Vert.x 5调整了WebSocketClientOptionsWebSocketConnectOptions的参数合并逻辑,建议把核心连接参数(如超时时间)统一放在WebSocketConnectOptions中,避免配置失效。

你可以先试试上面的修复代码,应该能解决连接立即关闭的问题。如果还是不行,DEBUG日志里的握手细节会是进一步排查的关键!

火山引擎 最新活动