0

私のアプリケーションのロジックでは、Binance exchange のすべてのペアに websocet 接続が必要です。

私はこのライブラリを使用します

Exchange からデータを受け取るには、次の 3 つの方法を使用します。

1.onAggTradeEvent

2.onAllMarketTickersEvent

  1. onDepthEvent

BinanceApiWebSocketClient クラスのインスタンスを 1 つだけ作成し、上記のメソッドを別のスレッドで呼び出します。これは私のコードです:

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);
       };
   }

バイナンス ライブラリのコールバック メソッドを再利用します

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 を初期化できませんでした。 org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) の onFailure(NettyChannelConnector.java:108) io.netty.util.concurrent の org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) .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) の .channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java: 106) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) で、org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) で、io.netty.util.concurrent.DefaultPromise で。io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) の notifyListener0(DefaultPromise.java:511) 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) org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure (NettyChannelConnector.java:106) 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) 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) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java) :28) 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) org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) 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) org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener) .java:28) 組織で。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) 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) で 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) 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.access $000(DefaultPromise.java:33) io.netty.util.concurrent.DefaultPromise$1.run(DefaultPromise.java:435) で io.netty.util.concurrent.GlobalEventExecutor$TaskRunner.run(GlobalEventExecutor.java:248) で io.netty.util.原因: java.lang.NoClassDefFoundError: クラス io.netty.channel.epoll.LinuxSocket を初期化できませんでした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 を作成します.reportGet(CompletableFuture.java:357) at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895) at org.asynchttpclient.netty.NettyResponseFuture.get(NettyResponseFuture.java:202) at exchange.binance.BinanceWebSocetCustomClient. createNewWebSocket(BinanceWebSocetCustomClient.java:65) exchange.binance.BinanceWebSocetCustomClient.onAggTradeEvent(BinanceWebSocetCustomClient.java:48) at exchange.Exchange.main(Exchange.java:74) 原因: java.net.ConnectException: クラス io.netty.channel.epoll を初期化できませんでしたorg.asynchttpclient.netty.channel.NettyConnectListener.onFailure(NettyConnectListener.java:179) の .LinuxSocket。 operationComplete(SimpleChannelFutureListener.java:28) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) .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) org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener) .java:28) 組織で。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) 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) で 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) 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 (デフォルトの約束。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) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:20) io.netty.util.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) で org.asynchttpclient.netty.channel.組織の NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106)。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.connect(NettyChannelConnector.java:69) で org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) で 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) io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java) :162) io.netty.channel で。org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:82) の io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30) の DefaultChannelPromise.addListener(DefaultChannelPromise.java:95) org.asynchttpclient.netty.channel.NettyChannelConnector$1.onFailure(NettyChannelConnector.java:106) の .netty.channel.NettyChannelConnector.connect(NettyChannelConnector.java:69) org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java: 28) io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) で io.netty.util.concurrent.DefaultPromise.access$000(DefaultPromise.java:33) で io.netty.util.concurrent.DefaultPromise$1.run(DefaultPromise.java:435) で 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) io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:320) で io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163) で io.netty.bootstrap.Bootstrap.connect(Bootstrap) で.java:156) at org.asynchttpclient.netty.channel.NettyChannelConnector.connect0(NettyChannelConnector.java:81) ... 77 個の共通フレームを省略

多分私はhttpクライアントを不適切な方法で設定しますか?

4

0 に答える 0