Skip to content

Commit 2ebca8e

Browse files
author
xiaotian.huang
committed
go
1 parent 96bbbd1 commit 2ebca8e

11 files changed

Lines changed: 392 additions & 30 deletions

File tree

pom.xml

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.binance.api</groupId>
88
<artifactId>binance-api-client</artifactId>
9-
<version>1.0.0</version>
9+
<version>1.0.0-SNAPSHOT</version>
1010

1111
<properties>
1212
<com.squareup.retrofit2.version>2.4.0</com.squareup.retrofit2.version>
@@ -41,6 +41,40 @@
4141
</dependency>
4242
</dependencies>
4343

44+
<repositories>
45+
<repository>
46+
<id>public</id>
47+
<url>http://192.168.50.190:8081/nexus/content/repositories/public/</url>
48+
</repository>
49+
<repository>
50+
<id>public-snapshots</id>
51+
<url>http://192.168.50.190:8081/nexus/content/repositories/snapshots/</url>
52+
</repository>
53+
<repository>
54+
<id>Central</id>
55+
<url>http://192.168.50.190:8081/nexus/content/repositories/central/</url>
56+
</repository>
57+
</repositories>
58+
59+
<pluginRepositories>
60+
<pluginRepository>
61+
<id>thirdparty</id>
62+
<url>http://192.168.50.190:8081/nexus/content/repositories/thirdparty/</url>
63+
</pluginRepository>
64+
</pluginRepositories>
65+
<distributionManagement>
66+
<repository>
67+
<id>baina-central</id>
68+
<url>http://192.168.50.190:8081/nexus/content/repositories/public/</url>
69+
</repository>
70+
<snapshotRepository>
71+
<id>baina-central</id>
72+
<name>User Project Snapshot</name>
73+
<url>http://192.168.50.190:8081/nexus/content/repositories/snapshots/</url>
74+
<uniqueVersion>true</uniqueVersion>
75+
</snapshotRepository>
76+
</distributionManagement>
77+
4478
<build>
4579
<plugins>
4680
<plugin>

src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package com.binance.api.client;
22

3-
import com.binance.api.client.domain.event.AggTradeEvent;
4-
import com.binance.api.client.domain.event.AllMarketTickersEvent;
5-
import com.binance.api.client.domain.event.CandlestickEvent;
6-
import com.binance.api.client.domain.event.DepthEvent;
7-
import com.binance.api.client.domain.event.UserDataUpdateEvent;
3+
import com.binance.api.client.domain.event.*;
84
import com.binance.api.client.domain.market.CandlestickInterval;
95

106
import java.io.Closeable;
@@ -24,6 +20,15 @@ public interface BinanceApiWebSocketClient extends Closeable {
2420
*/
2521
Closeable onDepthEvent(String symbols, BinanceApiCallback<DepthEvent> callback);
2622

23+
/**
24+
* 有限depth
25+
* @param symbols
26+
* @param callback
27+
* @param limit
28+
* @return
29+
*/
30+
Closeable onLimitDepthEvent(String symbols, Integer limit, BinanceApiCallback<LimitDepthEvent> callback);
31+
2732
/**
2833
* Open a new web socket to receive {@link CandlestickEvent candlestickEvents} on a callback.
2934
*
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.binance.api.client.domain.event;
2+
3+
import com.binance.api.client.constant.BinanceApiConstants;
4+
import com.binance.api.client.domain.market.OrderBookEntry;
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
import org.apache.commons.lang3.builder.ToStringBuilder;
8+
9+
import java.util.List;
10+
11+
/**
12+
* Limit Depth event for a symbol
13+
*
14+
* @author xiaotian.huang
15+
* @date 2019-05-18
16+
*/
17+
@JsonIgnoreProperties(ignoreUnknown = true)
18+
public class LimitDepthEvent {
19+
20+
private Long lastUpdatedId;
21+
22+
private List<OrderBookEntry> asks;
23+
24+
private List<OrderBookEntry> bids;
25+
26+
public LimitDepthEvent(@JsonProperty("lastUpdateId") Long lastUpdatedId,
27+
@JsonProperty("asks") List<OrderBookEntry> asks,
28+
@JsonProperty("bids") List<OrderBookEntry> bids) {
29+
this.lastUpdatedId = lastUpdatedId;
30+
this.asks = asks;
31+
this.bids = bids;
32+
}
33+
34+
public Long getLastUpdatedId() {
35+
return lastUpdatedId;
36+
}
37+
38+
public List<OrderBookEntry> getAsks() {
39+
return asks;
40+
}
41+
42+
public List<OrderBookEntry> getBids() {
43+
return bids;
44+
}
45+
46+
@Override
47+
public String toString() {
48+
return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE)
49+
.append("lastUpdatedId", lastUpdatedId)
50+
.append("asks", asks)
51+
.append("bids", bids)
52+
.toString();
53+
}
54+
}

src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@
33
import com.binance.api.client.BinanceApiCallback;
44
import com.binance.api.client.BinanceApiWebSocketClient;
55
import com.binance.api.client.constant.BinanceApiConstants;
6-
import com.binance.api.client.domain.event.AggTradeEvent;
7-
import com.binance.api.client.domain.event.AllMarketTickersEvent;
8-
import com.binance.api.client.domain.event.CandlestickEvent;
9-
import com.binance.api.client.domain.event.DepthEvent;
10-
import com.binance.api.client.domain.event.UserDataUpdateEvent;
6+
import com.binance.api.client.domain.event.*;
117
import com.binance.api.client.domain.market.CandlestickInterval;
8+
import com.binance.api.client.util.ReflectUtil;
9+
import com.binance.api.client.util.WebSocketMoniterContainer;
1210
import com.fasterxml.jackson.core.type.TypeReference;
1311

1412
import okhttp3.OkHttpClient;
1513
import okhttp3.Request;
1614
import okhttp3.WebSocket;
15+
import okhttp3.internal.ws.RealWebSocket;
1716

1817
import java.io.Closeable;
1918
import java.util.Arrays;
@@ -31,6 +30,15 @@ public BinanceApiWebSocketClientImpl(OkHttpClient client) {
3130
this.client = client;
3231
}
3332

33+
@Override
34+
public Closeable onLimitDepthEvent(String symbols, Integer limit, BinanceApiCallback<LimitDepthEvent> callback) {
35+
final String channel = Arrays.stream(symbols.split(","))
36+
.map(String::trim)
37+
.map(s -> String.format("%s@depth%d", s, limit))
38+
.collect(Collectors.joining("/"));
39+
return createNewWebSocket(channel, new BinanceApiWebSocketListener<>(callback, LimitDepthEvent.class));
40+
}
41+
3442
@Override
3543
public Closeable onDepthEvent(String symbols, BinanceApiCallback<DepthEvent> callback) {
3644
final String channel = Arrays.stream(symbols.split(","))
@@ -76,6 +84,8 @@ private Closeable createNewWebSocket(String channel, BinanceApiWebSocketListener
7684
String streamingUrl = String.format("%s/%s", BinanceApiConstants.WS_API_BASE_URL, channel);
7785
Request request = new Request.Builder().url(streamingUrl).build();
7886
final WebSocket webSocket = client.newWebSocket(request, listener);
87+
// 放入容器, 给其他服务处理
88+
WebSocketMoniterContainer.inst().add(channel, webSocket);
7989
return () -> {
8090
final int code = 1000;
8191
listener.onClosing(webSocket, code, null);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.binance.api.client.util;
2+
3+
import okhttp3.WebSocket;
4+
5+
import java.util.Map;
6+
import java.util.Set;
7+
import java.util.TimerTask;
8+
9+
/**
10+
* @author xiaotian.huang
11+
* @date 2019-05-17
12+
*/
13+
public class MoniterTask extends TimerTask {
14+
private Map<String, WebSocket> webSocketMap = WebSocketMoniterContainer.inst().getWebSocketMap();
15+
// mark
16+
private int markCount;
17+
//
18+
private final int ALLOWABLE_DIFFERENCE = 2;
19+
20+
@Override
21+
public void run() {
22+
Set<Map.Entry<String, WebSocket>> entrySet = webSocketMap.entrySet();
23+
for (Map.Entry<String, WebSocket> entry : entrySet) {
24+
String channel = entry.getKey();
25+
System.out.println(channel);
26+
WebSocket webSocket = entry.getValue();
27+
Integer pongCount = getPongCount(webSocket);
28+
System.out.println(pongCount);
29+
}
30+
}
31+
32+
private Integer getPongCount(WebSocket webSocket) {
33+
return ReflectUtil.getFiledValue(webSocket, "receivedPongCount", Integer.class);
34+
}
35+
36+
37+
private void initMark() {
38+
markCount = 0;
39+
}
40+
41+
private void updateMark() {
42+
this.markCount++;
43+
}
44+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.binance.api.client.util;
2+
3+
import java.lang.reflect.Field;
4+
5+
/**
6+
* 反射获取
7+
*
8+
* @author xiaotian.huang
9+
* @date 2019-05-17
10+
*/
11+
public class ReflectUtil {
12+
13+
/** 获取对象中的指定字段 */
14+
public static <T,S> T getFiledValue(S s, String fieldName, Class<T> tClass) {
15+
Object value;
16+
try {
17+
Field field = s.getClass().getDeclaredField(fieldName);
18+
field.setAccessible(true);
19+
value = field.get(s);
20+
} catch (Exception e) {
21+
e.printStackTrace();
22+
return null;
23+
}
24+
return (T)value;
25+
}
26+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.binance.api.client.util;
2+
3+
import okhttp3.WebSocket;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
import java.util.Objects;
8+
9+
/**
10+
* websocket 容器
11+
*
12+
* @author xiaotian.huang
13+
* @date 2019-05-17
14+
*/
15+
public class WebSocketMoniterContainer {
16+
17+
private Map<String,WebSocket> webSocketMap = new HashMap<>();
18+
19+
private static WebSocketMoniterContainer container;
20+
21+
private WebSocketMoniterContainer() {
22+
}
23+
24+
public static WebSocketMoniterContainer inst() {
25+
if (Objects.isNull(container)) {
26+
container = new WebSocketMoniterContainer();
27+
}
28+
return container;
29+
}
30+
31+
public void add(String channel, WebSocket webSocket) {
32+
webSocketMap.put(channel, webSocket);
33+
}
34+
35+
public Map<String,WebSocket> getWebSocketMap() {
36+
return webSocketMap;
37+
}
38+
}

src/test/java/com/binance/api/examples/MarketDataStreamExample.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
import com.binance.api.client.BinanceApiClientFactory;
44
import com.binance.api.client.BinanceApiWebSocketClient;
55
import com.binance.api.client.domain.market.CandlestickInterval;
6+
import com.binance.api.client.util.MoniterTask;
67

78
import java.io.IOException;
9+
import java.sql.SQLOutput;
10+
import java.sql.Time;
11+
import java.util.Collections;
12+
import java.util.Timer;
813

914
/**
1015
* Market data stream endpoints examples.
@@ -17,12 +22,18 @@ public static void main(String[] args) throws InterruptedException, IOException
1722
BinanceApiWebSocketClient client = BinanceApiClientFactory.newInstance().newWebSocketClient();
1823

1924
// Listen for aggregated trade events for ETH/BTC
20-
client.onAggTradeEvent("ethbtc", response -> System.out.println(response));
25+
// client.onAggTradeEvent("ethbtc,ltcbtc", response -> {});
26+
2127

2228
// Listen for changes in the order book in ETH/BTC
23-
client.onDepthEvent("ethbtc", response -> System.out.println(response));
29+
client.onDepthEvent("ethbtc,ltcbtc", response -> {});
30+
31+
client.onLimitDepthEvent("ethbtc,ltcbtc", 10, response -> System.out.println(response));
32+
33+
// Obtain 1m c
34+
// esticks in real-time for ETH/BTC
35+
// client.onCandlestickEvent("ethbtc,ltcbtc", CandlestickInterval.ONE_MINUTE, response -> {});
2436

25-
// Obtain 1m candlesticks in real-time for ETH/BTC
26-
client.onCandlestickEvent("ethbtc", CandlestickInterval.ONE_MINUTE, response -> System.out.println(response));
37+
new Timer().schedule(new MoniterTask(), 1000 *10, 5000);
2738
}
2839
}

0 commit comments

Comments
 (0)