Java使用binance4j开发币安机器人如何终止websocket退出事件处理器
实现方法
binance4j的websocket客户端基类自带连接关闭方法,配合JDK线程同步工具即可实现需求,核心逻辑分两点:
- 直接在回调中调用客户端实例的
close()方法,即可主动断开websocket连接,自动注销所有事件处理器,不会再接收后续推送消息。 - websocket客户端默认是异步非阻塞模式,
open()方法不会阻塞主线程,要在连接关闭后把执行权交回主函数,使用CountDownLatch做线程同步等待即可。
修正后可直接运行的代码
import java.util.concurrent.CountDownLatch; // 自行引入项目中对应的binance4j、K线间隔类依赖 public class Timer { private static final String SYMBOL = "btcusdt".toUpperCase(); public Timer(CandlestickInterval interval) throws InterruptedException { WebsocketCandlestickClient client = new WebsocketCandlestickClient(SYMBOL, interval); CountDownLatch exitLatch = new CountDownLatch(1); // 注意:先注册消息监听再打开连接,避免漏收连接初期的推送消息 client.onMessage(cb -> { if (cb.getIsBarFinal()) { // 此处可写入K线收盘后需要执行的业务逻辑 // 关闭websocket连接 client.close(); // 唤醒等待的主线程 exitLatch.countDown(); } }); client.open(); // 阻塞当前线程,直到收到收盘K线、连接关闭后才继续向下执行 exitLatch.await(); } }
补充说明
- 如果不需要主线程同步等待K线收盘结果,仅需在条件满足时断开连接,去掉
CountDownLatch相关逻辑,直接在回调里调用client.close()即可。 close()方法会自动释放底层连接资源,移除所有注册的事件监听,不会出现内存泄漏问题。
内容的提问来源于stack exchange,提问作者AnSill
相关产品推荐
相关产品推荐

