com.binance.connector.client.impl.WebSocketStreamClientImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of binance-connector-java Show documentation
Show all versions of binance-connector-java Show documentation
lightweight connector to API
package com.binance.connector.client.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.binance.connector.client.WebSocketStreamClient;
import com.binance.connector.client.enums.DefaultUrls;
import com.binance.connector.client.exceptions.BinanceConnectorException;
import com.binance.connector.client.utils.ParameterChecker;
import com.binance.connector.client.utils.RequestBuilder;
import com.binance.connector.client.utils.UrlBuilder;
import com.binance.connector.client.utils.WebSocketConnection;
import com.binance.connector.client.utils.httpclient.WebSocketStreamHttpClientSingleton;
import com.binance.connector.client.utils.websocketcallback.WebSocketClosedCallback;
import com.binance.connector.client.utils.websocketcallback.WebSocketClosingCallback;
import com.binance.connector.client.utils.websocketcallback.WebSocketFailureCallback;
import com.binance.connector.client.utils.websocketcallback.WebSocketMessageCallback;
import com.binance.connector.client.utils.websocketcallback.WebSocketOpenCallback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/**
* WebSocket Streams
* All stream endpoints under the
* WebSocket Market Streams and
* User Data Streams
* section of the API documentation will be implemented in this class.
*
* Response will be returned as callback.
*/
public class WebSocketStreamClientImpl implements WebSocketStreamClient {
private static final Logger logger = LoggerFactory.getLogger(WebSocketStreamClientImpl.class);
private static final OkHttpClient client = WebSocketStreamHttpClientSingleton.getHttpClient();
private final String baseUrl;
private final Map connections = new HashMap<>();
private final WebSocketOpenCallback noopOpenCallback = response -> { };
private final WebSocketClosingCallback noopClosingCallback = (code, reason) -> { };
private final WebSocketClosedCallback noopClosedCallback = (code, reason) -> { };
private final WebSocketFailureCallback noopFailureCallback = (throwable, response) -> { };
public WebSocketStreamClientImpl() {
this.baseUrl = DefaultUrls.WS_URL;
}
public WebSocketStreamClientImpl(String baseUrl) {
this.baseUrl = baseUrl;
}
/**
* The Aggregate Trade Streams push trade information that is aggregated for a single taker order.
*
* <symbol>@aggTrade
*
* Update Speed: Real-time
*
* @param symbol Name of the trading pair
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#aggregate-trade-streams
*/
@Override
public int aggTradeStream(String symbol, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return aggTradeStream(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #aggTradeStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int aggTradeStream(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@aggTrade", baseUrl, symbol.toLowerCase()));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* The Trade Streams push raw trade information; each trade has a unique buyer and seller.
*
* <symbol>@trade
*
* Update Speed: Real-time
*
* @param symbol Name of the trading pair
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#trade-streams
*/
@Override
public int tradeStream(String symbol, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return tradeStream(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #tradeStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int tradeStream(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@trade", baseUrl, symbol.toLowerCase()));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* The Kline/Candlestick Stream push updates to the current klines/candlestick every second.
*
* <symbol>@kline_<interval>
*
* Update Speed: Real-time
*
* @param symbol Name of the trading pair
* @param interval Time interval for kline/candlestick
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-streams
*/
@Override
public int klineStream(String symbol, String interval, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return klineStream(symbol.toLowerCase(), interval, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #klineStream(String, String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param interval Time interval for kline/candlestick
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int klineStream(String symbol, String interval, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@kline_%s", baseUrl, symbol.toLowerCase(), interval));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* 24hr rolling window mini-ticker statistics.
* These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs.
*
* <symbol>@miniTicker
*
* Update Speed: Real-time
*
* @param symbol Name of the trading pair
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-mini-ticker-stream
*/
@Override
public int miniTickerStream(String symbol, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return miniTickerStream(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #miniTickerStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int miniTickerStream(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@miniTicker", baseUrl, symbol.toLowerCase()));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* 24hr rolling window mini-ticker statistics for all symbols that changed in an array.
* These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs.
* Note that only tickers that have changed will be present in the array.
*
* !miniTicker@arr
*
* Update Speed: Real-time
*
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#all-market-mini-tickers-stream
*/
@Override
public int allMiniTickerStream(WebSocketMessageCallback callback) {
return allMiniTickerStream(noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #allMiniTickerStream(WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int allMiniTickerStream(WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/!miniTicker@arr", baseUrl));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* 24hr rolling window ticker statistics for a single symbol.
* These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs.
*
* <symbol>@ticker
*
* Update Speed: Real-time
*
* @param symbol Name of the trading pair
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-ticker-streams
*/
@Override
public int symbolTicker(String symbol, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return symbolTicker(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #symbolTicker(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int symbolTicker(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@ticker", baseUrl, symbol.toLowerCase()));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* 24hr rolling window ticker statistics for all symbols that changed in an array.
* These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs.
* Note that only tickers that have changed will be present in the array.
*
* !ticker@arr
*
* Update Speed: Real-time
*
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#all-market-tickers-stream
*/
@Override
public int allTickerStream(WebSocketMessageCallback callback) {
return allTickerStream(noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #allTickerStream(WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int allTickerStream(WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/!ticker@arr", baseUrl));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* Rolling window ticker statistics for a single symbol, computed over multiple windows.
*
* <symbol>@ticker_<window_size>
*
* Update Speed: Real-time
*
* @param symbol Name of the trading pair
* @param windowSize Window Sizes: 1h,4h
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-rolling-window-statistics-streams
*/
public int rollingWindowTicker(String symbol, String windowSize, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
ParameterChecker.checkParameterType(symbol, String.class, "windowSize");
ArrayList allowedWindowSize = new ArrayList() {{
add("1h");
add("4h");
}};
if (!allowedWindowSize.contains(windowSize)) {
throw new BinanceConnectorException(String.format("\"%s\" is not a valid window size.", windowSize));
}
return rollingWindowTicker(symbol.toLowerCase(), windowSize, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #rollingWindowTicker(String, String, WebSocketMessageCallback)} (String, WebSocketCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int rollingWindowTicker(String symbol, String windowSize, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
ParameterChecker.checkParameterType(symbol, String.class, "windowSize");
ArrayList allowedWindowSize = new ArrayList() {{
add("1h");
add("4h");
}};
if (!allowedWindowSize.contains(windowSize)) {
throw new BinanceConnectorException(String.format("\"%s\" is not a valid window size.", windowSize));
}
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@ticker_%s", baseUrl, symbol.toLowerCase(), windowSize));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* Rolling window ticker statistics for all market symbols, computed over multiple windows.
* Note that only tickers that have changed will be present in the array.
*
* !ticker_<window-size>@arr
*
* Update Speed: Real-time
*
* @param windowSize Window Sizes: 1h,4h
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#all-market-rolling-window-statistics-streams
*/
@Override
public int allRollingWindowTicker(String windowSize, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(windowSize, String.class, "windowSize");
ArrayList allowedWindowSize = new ArrayList() {{
add("1h");
add("4h");
}};
if (!allowedWindowSize.contains(windowSize.toLowerCase())) {
throw new BinanceConnectorException(String.format("\"%s\" is not a valid window size.", windowSize.toLowerCase()));
}
return allRollingWindowTicker(windowSize.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #allRollingWindowTicker(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param windowSize Window Sizes: 1h,4h
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int allRollingWindowTicker(String windowSize, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(windowSize, String.class, "windowSize");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/!ticker_%s@arr", baseUrl, windowSize.toLowerCase()));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* Pushes any update to the best bid or ask's price or quantity in real-time for a specified symbol.
*
* <symbol>@bookTicker
*
* Update Speed: Real-time
*
* @param symbol Name of the trading pair
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-book-ticker-streams
*/
@Override
public int bookTicker(String symbol, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return bookTicker(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #bookTicker(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int bookTicker(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@bookTicker", baseUrl, symbol.toLowerCase()));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* Top bids and asks, Valid are 5, 10, or 20.
*
* <symbol>@depth<levels>@<speed>ms
*
* Update Speed: 1000ms or 100ms
*
* @param symbol Name of the trading pair
* @param levels Valid are 5, 10, or 20
* @param speed 1000ms or 100ms
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#partial-book-depth-streams
*/
@Override
public int partialDepthStream(String symbol, int levels, int speed, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return partialDepthStream(symbol.toLowerCase(), levels, speed, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #partialDepthStream(String, int, int, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param levels Valid are 5, 10, or 20
* @param speed 1000ms or 100ms
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int partialDepthStream(String symbol, int levels, int speed, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@depth%s@%sms", baseUrl, symbol.toLowerCase(), levels, speed));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* Order book price and quantity depth updates used to locally manage an order book.
*
* <symbol>@depth@<speed>ms
*
* Update Speed: 1000ms or 100ms
*
* @param symbol Name of the trading pair
* @param speed 1000ms or 100ms
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#diff-depth-stream
*/
@Override
public int diffDepthStream(String symbol, int speed, WebSocketMessageCallback callback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
return diffDepthStream(symbol.toLowerCase(), speed, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #diffDepthStream(String, int, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param symbol Name of the trading pair
* @param speed 1000ms or 100ms
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int diffDepthStream(String symbol, int speed, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
ParameterChecker.checkParameterType(symbol, String.class, "symbol");
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@depth@%sms", baseUrl, symbol.toLowerCase(), speed));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* User Data Streams are accessed at /ws/<listenKey>
*
* @param listenKey listen key obtained from this
* endpoint
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#user-data-streams
*/
@Override
public int listenUserStream(String listenKey, WebSocketMessageCallback callback) {
return listenUserStream(listenKey, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #listenUserStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param listenKey listen key obtained from this
* endpoint
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int listenUserStream(String listenKey, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s", baseUrl, listenKey));
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* Combined streams are accessed at /stream?streams=<streamName1>/<streamName2>/<streamName3>
*
* @param streams ArrayList of stream names to be combined
* @return int - Connection ID
* @see
* https://binance-docs.github.io/apidocs/spot/en/#websocket-market-streams
*/
@Override
public int combineStreams(ArrayList streams, WebSocketMessageCallback callback) {
return combineStreams(streams, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback);
}
/**
* Same as {@link #combineStreams(ArrayList, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events.
*
* @param streams ArrayList of stream names to be combined
* @param onOpenCallback Callback for when the websocket connection is opened
* @param onMessageCallback Callback for when a message is received
* @param onClosingCallback Callback for when the websocket connection is closing
* @param onFailureCallback Callback for when an error occurs
* @return int - Connection ID
*/
@Override
public int combineStreams(ArrayList streams, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) {
String url = UrlBuilder.buildStreamUrl(baseUrl, streams);
Request request = RequestBuilder.buildWebSocketRequest(url);
return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request);
}
/**
* Closes a specific stream based on stream ID.
*
* @param connectionId The connection ID to close.
*/
@Override
public void closeConnection(int connectionId) {
if (connections.containsKey(connectionId)) {
connections.get(connectionId).close();
logger.info("Closing Connection ID {}", connectionId);
connections.remove(connectionId);
} else {
logger.info("Connection ID {} does not exist!", connectionId);
}
}
/**
* Closes all streams
*/
@Override
public void closeAllConnections() {
if (!connections.isEmpty()) {
logger.info("Closing {} connections(s)", connections.size());
Iterator> iter = connections.entrySet().iterator();
while (iter.hasNext()) {
WebSocketConnection connection = iter.next().getValue();
connection.close();
iter.remove();
}
}
if (connections.isEmpty()) {
client.dispatcher().executorService().shutdown();
logger.info("All connections are closed!");
}
}
private int createConnection(
WebSocketOpenCallback onOpenCallback,
WebSocketMessageCallback onMessageCallback,
WebSocketClosingCallback onClosingCallback,
WebSocketClosedCallback onClosedCallback,
WebSocketFailureCallback onFailureCallback,
Request request
) {
WebSocketConnection connection = new WebSocketConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request, client);
connection.connect();
int connectionId = connection.getConnectionId();
connections.put(connectionId, connection);
return connectionId;
}
}