【问题标题】:Simultaneous two OkHttp websocket connections, one of them getting thread starved同时有两个 OkHttp websocket 连接,其中一个线程饿死
【发布时间】:2022-09-24 16:04:11
【问题描述】:

在我在 Intellij 中运行的 Spring Boot 应用程序中,我有一个 @Scheduled 任务,并且两个 WebSocket 流使用来自两个不同 OkHttpClients 实例的 OkHttp 连接打开到两个不同的服务器。我认为 OkHttpClient.Builder 中的连接池设置与此处无关,因为 OkHttpClient 有两个实例。两个 websocket 流最初都接收一些事件,然后其中一个不再接收任何事件。我还通过打印工作线程的哈希码来验证它们是不同的。 [![图片][1]][1]

可悲的是,我在命令行 mvn run 上也注意到了同样的问题,所以它似乎不是 Intellij 特定的问题。

如何使两个套接字流上连续接收到的事件?如果我重用相同的 OkHttpClient 来创建两个连接,会有帮助吗?

更新:不想浪费时间等待解决这个问题,我采取了极端的步骤,将每个应用程序分成 2 个单独的应用程序,每个应用程序都有一个 websocket 侦听器。然而我面临同样的问题,其中一个在开始几秒钟后停止接收任何回调。不能把它归咎于远程服务器,因为如果我单独运行其中任何一个,它永远不会停止接收回调流。我需要它们同时启动并运行并相互通信。

fwiw,我正在使用 [this][2] 客户端库订阅一个 WebSocket 流,并使用 [this][3] 订阅另一个。第一个端点是 wss://stream.binance.com:9443/ws/btcusdt@aggTrade,第二个端点是 wss://fstream.binance.com。后一个订阅是通过向其发布 JSON {\"method\":\"SUBSCRIBE\",\"id\":1663348051361,\"params\":\"btcusdt@aggTrade\"} 来建立的。

我已经与服务器端点的客户支持聊天,他们无法帮助我,他们只是说如果我能够单独订阅套接字流就好了,他们看不出有任何理由当我同时提出它们时,它们应该停止工作。 [1]:https://i.stack.imgur.com/T5oia.png [2]:https://github.com/binance-exchange/binance-java-api/blob/master/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java#L47 [3]:https://github.com/Binance-docs/Binance_Futures_Java/blob/master/src/main/java/com/binance/client/impl/WebSocketStreamClientImpl.java#L63

    标签: java spring-boot okhttp java-threads


    【解决方案1】:

    每个 WebSocket 都有自己的线程。会不会是你听众的某些东西?

    【讨论】:

    • 如果有,则控制台上没有任何内容可以指示侦听器崩溃,例如未捕获的异常。
    • 你是对的,当我为监听器方法输入和退出记录语句时,我注意到在正常运行几秒钟后,有一个没有退出的输入,所以我的监听器代码确实有问题,或者这个线程被抢占了并且由于某种原因,从那里开始只有另一个侦听器线程占主导地位。
    • 更正,我的听众没有错误。中间还有另一个 return 语句,我忘记打印 Exit 日志,现在 Enter 和 Exit 之间没有看到不平衡。它只是突然停止被调用。
    猜你喜欢
    • 2019-05-01
    • 2020-02-11
    • 2014-04-16
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多