0

我的应用程序的逻辑要求 Binance 交易所上的每一对都需要 websocet 连接。

我使用这个库

我使用三种方法从交换接收数据:

1.onAggTradeEvent

2.onAllMarketTickers事件

  1. onDepthEvent

我只创建 BinanceApiWebSocketClient 类的一个实例,并在单独的线程中调用上述方法。这是我的代码:

pairs().stream().forEach(pair->{
            wsClient.onDepthEvent(symboltoLowerCase(),orderBookCallback());
        });
pairs().stream().forEach(pair->{
            wsClient.onAggTradeEvent(symbol.toLowerCase(), tradesCallback());
        });
pairs().stream().forEach(pair->{
wsClient.onAllMarketTickersEvent(tickers -> {//some logic here});
        });

当我运行这段代码一段时间后,它可以工作,但是 websockets 关闭时没有任何错误。当我为我的问题搜索解决方案时,我发现不仅我遇到了这个问题,而且我使用基于此代码的AsyncHttpClient为 Binance 交换编写自定义客户端

我以这种方式初始化http客户端:

private AsyncHttpClient client;

    public BinanceWebSocketCustomClient() {
        this.client = HttpUtils.newAsyncHttpClient(new DefaultEventLoopGroup(1000),100,1000);
    }

我创建 websocket 如下:

private Closeable createNewWebSocket(String channel, BinanceWebsocetListener listener){
       String streamingUrl = String.format("%s/%s", BinanceApiConstants.WS_API_BASE_URL, channel);
       AtomicReference<NettyWebSocket> websocetReference = new AtomicReference<>();
       try {
           NettyWebSocket nettyWebSocket = client.prepareGet(streamingUrl).execute(new WebSocketUpgradeHandler.Builder()
                   .addWebSocketListener(listener).build()).get();
           websocetReference.set(nettyWebSocket);
       } catch (InterruptedException | ExecutionException e) {
           LOG.error("create new websocet",e);
       }
       return () -> {
           final int code = 1000;
           listener.onClose(websocetReference.get(),code,null);
           websocetReference.get().onClose(1000,null);
       };
   }

我重用binance库回调方法

public Closeable onAggTradeEvent(String symbol, BinanceApiCallback<AggTradeEvent> callback) {
        final String channel = String.format("%s@aggTrade", symbol);
        return createNewWebSocket(channel, new BinanceWebsocetListener<>(callback, AggTradeEvent.class));
    }

但是当我运行此代码时,我收到错误:

java.net.ConnectException:无法在 org.asynchttpclient.netty.channel.NettyChannelConnector$1 的 org.asynchttpclient.netty.channel.NettyConnectListener.onFailure(NettyConnectListener.java:179) 处初始化类 io.netty.channel.epoll.LinuxSocket。 onFailure(NettyChannelConnector.java:108) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) at io.netty.util.concurrent .DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) 在io.netty.util.concurrent。DefaultPromise.addListener(DefaultPromise.java:162) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) at org.asynchttpclient.netty .channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) 在 org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java: 106) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) 在 io.netty.util.concurrent.DefaultPromise 的 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28)。notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) 在 io.netty .util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) 在org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) at org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure (NettyChannelConnector.java:106) 在 org.asynchttpclient.netty。SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) at io.netty .util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) 在 io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java :162) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect0( NettyChannelConnector.java:82) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) at org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java :28) 在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise 的 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20)。 notifyListenersNow(DefaultPromise.java:485) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) at io.netty .channel.DefaultChannelPromise。addListener(DefaultChannelPromise.java:95) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) at org.asynchttpclient.netty .channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) at org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28)在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise 的 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20)。notifyListenersNow(DefaultPromise.java:485) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) at io.netty .channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) at org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener .java:28) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) 在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:第 485 章(DefaultChannelPromise.java:95) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) 在 org.asynchttpclient.netty。通道.NettyChannelConnector.connect(NettyChannelConnector.java:69) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete( SimpleChannelFutureListener.java:20) 在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util .concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) at io.netty.channel.DefaultChannelPromise。addListener(DefaultChannelPromise.java:30) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) at org.asynchttpclient .netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20)在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.access $000(DefaultPromise.java:33) 在 io.netty.util.concurrent.GlobalEventExecutor$TaskRunner.run(GlobalEventExecutor.java:248) 在 io.netty.util 的 io.netty.util.concurrent.DefaultPromise$1.run(DefaultPromise.java:435)。 concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) 原因:java.lang.NoClassDefFoundError: 无法初始化类 io.netty.channel.epoll.LinuxSocket at io.netty.channel.epoll.EpollSocketChannel.(EpollSocketChannel.java:45) 在 org.asynchttpclient.netty.channel.EpollSocketChannelFactory.newChannel(EpollSocketChannelFactory.java:23) 在 org.asynchttpclient.netty.channel.EpollSocketChannelFactory.newChannel(EpollSocketChannelFactory .java:19) 在 io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:320) 在 io.netty.bootstrap。Bootstrap.doResolveAndConnect(Bootstrap.java:163) at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:156) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:81) ... 77公共框架省略错误 BinanceWebSocetCustomClient [BinanceWebSocetCustomClient.java:68] 创建新的 websocet java.util.concurrent.ExecutionException: java.net.ConnectException: 无法在 java.util.concurrent.CompletableFuture 初始化类 io.netty.channel.epoll.LinuxSocket .reportGet(CompletableFuture.java:357) 在 java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895) 在 org.asynchttpclient.netty.NettyResponseFuture.get(NettyResponseFuture.java:202) 在 exchange.binance.BinanceWebSocetCustomClient。 createNewWebSocket(BinanceWebSocetCustomClient.java:65) 在 exchange.binance.BinanceWebSocetCustomClient.onAggTradeEvent(BinanceWebSocetCustomClient.java:48) 在 exchange.Exchange.main(Exchange.java:74) 原因:java.net.ConnectException:无法初始化类 io.netty.channel.epoll .LinuxSocket 在 org.asynchttpclient.netty.channel.NettyConnectListener.onFailure(NettyConnectListener.java:179) 在 org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:108) 在 org.asynchttpclient.netty.SimpleChannelFutureListener。 operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) at io.netty.util .concurrent.DefaultPromise。notifyListenersNow(DefaultPromise.java:485) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) at io.netty .channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) at org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener .java:28) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) 在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:第 485 章(DefaultChannelPromise.java:95) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) 在 org.asynchttpclient.netty。通道.NettyChannelConnector.connect(NettyChannelConnector.java:69) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete( SimpleChannelFutureListener.java:20) 在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util .concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) at io.netty.channel.DefaultChannelPromise。addListener(DefaultChannelPromise.java:30) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) at org.asynchttpclient .netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20)在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.notifyListeners (默认承诺。java:424) 在 io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) 在 io.netty.channel.DefaultChannelPromise.addListener (DefaultChannelPromise.java:30) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) 在 org.asynchttpclient。 netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) at io.netty.util。concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)在 io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java :30) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) 在 org.asynchttpclient.netty.channel 的 org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82)。 NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)在 io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) 在 io.netty.util.concurrent.DefaultPromise.addListener (DefaultPromise.java:162) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) 在 io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) 在 org.asynchttpclient.netty.channel。 NettyChannelConnector.connect0(NettyChannelConnector.java:82) 在 org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) 在 org.asynchttpclient.netty 的 org.asynchttpclient.netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69)。 SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) at io.netty .util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) 在 io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) 在 io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java :162) 在 io.netty.channel。DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) at org.asynchttpclient .netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) 在 org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) 在 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java: 28) 在 io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) 在 io.netty.util.concurrent.DefaultPromise 的 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20)。notifyListenersNow(DefaultPromise.java:485) at io.netty.util.concurrent.DefaultPromise.access$000(DefaultPromise.java:33) at io.netty.util.concurrent.DefaultPromise$1.run(DefaultPromise.java:435) at io .netty.util.concurrent.GlobalEventExecutor$TaskRunner.run(GlobalEventExecutor.java:248) 在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 在 java.lang.Thread.run(Thread.java :748) 原因:java.lang.NoClassDefFoundError: 无法在 org.asynchttpclient.netty 的 io.netty.channel.epoll.EpollSocketChannel.(EpollSocketChannel.java:45) 初始化类 io.netty.channel.epoll.LinuxSocket。 channel.EpollSocketChannelFactory.newChannel(EpollSocketChannelFactory.java:23) 在 org.asynchttpclient.netty.channel.EpollSocketChannelFactory.newChannel(EpollSocketChannelFactory.java:19) at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:320) at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163) at io.netty.bootstrap.Bootstrap.connect(Bootstrap .java:156) 在 org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:81) ... 省略了 77 个公共帧

也许我配置http客户端不正确的方式?

4

0 回答 0