Skip to content

Commit 70e82dc

Browse files
author
weiqiangliu
committed
Release 3.6.1
1 parent f33b124 commit 70e82dc

11 files changed

Lines changed: 325 additions & 14 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ SensorsAnalytics SDK 是国内第一家开源商用版用户行为采集 SDK,
3333

3434
## License
3535

36-
Copyright 2015-2022 Sensors Data Inc.
36+
Copyright 2015-2023 Sensors Data Inc.
3737

3838
Licensed under the Apache License, Version 2.0 (the "License");
3939
you may not use this file except in compliance with the License.

SensorsAnalyticsSDK/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<groupId>com.sensorsdata.analytics.javasdk</groupId>
1616
<name>SensorsAnalyticsSDK</name>
1717
<artifactId>SensorsAnalyticsSDK</artifactId>
18-
<version>3.6.0</version>
18+
<version>3.6.1</version>
1919
<description>The official Java SDK of Sensors Analytics</description>
2020
<url>http://sensorsdata.cn</url>
2121

SensorsAnalyticsSDK/src/main/java/com/sensorsdata/analytics/javasdk/SensorsConst.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ private SensorsConst() {
1515
/**
1616
* 当前JDK版本号,注意要和pom文件里面的version保持一致
1717
*/
18-
public static final String SDK_VERSION = "3.6.0";
18+
public static final String SDK_VERSION = "3.6.1";
1919
/**
2020
* 当前语言类型
2121
*/

SensorsAnalyticsSDK/src/main/java/com/sensorsdata/analytics/javasdk/consumer/BatchConsumer.java

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.apache.http.impl.client.HttpClientBuilder;
99
import org.apache.http.impl.client.HttpClients;
1010

11+
import java.util.ArrayList;
12+
import java.util.Arrays;
1113
import java.util.LinkedList;
1214
import java.util.List;
1315
import java.util.Map;
@@ -20,10 +22,13 @@ public class BatchConsumer implements Consumer {
2022

2123
private final List<Map<String, Object>> messageList;
2224
private final HttpConsumer httpConsumer;
25+
private final InstantHttpConsumer instantHttpConsumer;
2326
private final ObjectMapper jsonMapper;
2427
private final int bulkSize;
2528
private final boolean throwException;
2629
private final int maxCacheSize;
30+
private List<String> instantEvents;
31+
private boolean isInstantStatus;
2732

2833
public BatchConsumer(final String serverUrl) {
2934
this(serverUrl, 50);
@@ -58,8 +63,22 @@ public BatchConsumer(final String serverUrl, final int bulkSize, final int maxCa
5863

5964
public BatchConsumer(HttpClientBuilder httpClientBuilder, final String serverUrl, final int bulkSize, final int maxCacheSize,
6065
final boolean throwException, final int timeoutSec) {
66+
this(httpClientBuilder, serverUrl, bulkSize, maxCacheSize, throwException, timeoutSec, new ArrayList<String>());
67+
}
68+
69+
70+
public BatchConsumer(final String serverUrl, final int bulkSize, final int maxCacheSize,
71+
final boolean throwException, final int timeoutSec, List<String> instantEvents) {
72+
this(HttpClients.custom(), serverUrl, bulkSize, maxCacheSize, throwException, timeoutSec, instantEvents);
73+
}
74+
75+
public BatchConsumer(HttpClientBuilder httpClientBuilder, final String serverUrl, final int bulkSize, final int maxCacheSize,
76+
final boolean throwException, final int timeoutSec, List<String> instantEvents) {
6177
this.messageList = new LinkedList<>();
78+
this.isInstantStatus = false;
79+
this.instantEvents = instantEvents;
6280
this.httpConsumer = new HttpConsumer(httpClientBuilder, serverUrl, Math.max(timeoutSec, 1));
81+
this.instantHttpConsumer = new InstantHttpConsumer(httpClientBuilder, serverUrl, Math.max(timeoutSec, 1));
6382
this.jsonMapper = SensorsAnalyticsUtil.getJsonObjectMapper();
6483
this.bulkSize = Math.min(MAX_FLUSH_BULK_SIZE, Math.max(1, bulkSize));
6584
if (maxCacheSize > MAX_CACHE_SIZE) {
@@ -78,6 +97,7 @@ public BatchConsumer(HttpClientBuilder httpClientBuilder, final String serverUrl
7897
@Override
7998
public void send(Map<String, Object> message) {
8099
synchronized (messageList) {
100+
dealInstantSignal(message);
81101
int size = messageList.size();
82102
if (maxCacheSize <= 0 || size < maxCacheSize) {
83103
messageList.add(message);
@@ -110,7 +130,11 @@ public void flush() {
110130
}
111131
log.debug("Will be send data:{}.", sendingData);
112132
try {
113-
this.httpConsumer.consume(sendingData);
133+
if (isInstantStatus) {
134+
this.instantHttpConsumer.consume(sendingData);
135+
} else {
136+
this.httpConsumer.consume(sendingData);
137+
}
114138
sendList.clear();
115139
} catch (Exception e) {
116140
log.error("Failed to send data:{}.", sendingData, e);
@@ -131,4 +155,23 @@ public void close() {
131155
httpConsumer.close();
132156
log.info("Call close method.");
133157
}
158+
159+
private void dealInstantSignal(Map<String, Object> message) {
160+
161+
/*
162+
* 如果当前是「instant」状态,且(message中不包含event 或者 event 不是「instant」的,则刷新,设置 「非instant」状态
163+
*/
164+
if (isInstantStatus && (!message.containsKey("event") || !instantEvents.contains(message.get("event")))) {
165+
flush();
166+
isInstantStatus = false;
167+
}
168+
169+
/*
170+
* 如果当前是 「非instant」状态,且(message中包含event 且 event 是「instant」的,则刷新,设置 「instant」状态
171+
*/
172+
if (!isInstantStatus && message.containsKey("event") && instantEvents.contains(message.get("event"))) {
173+
flush();
174+
isInstantStatus = true;
175+
}
176+
}
134177
}

SensorsAnalyticsSDK/src/main/java/com/sensorsdata/analytics/javasdk/consumer/FastBatchConsumer.java

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,13 @@ public class FastBatchConsumer implements Consumer {
3636

3737
private final LinkedBlockingQueue<Map<String, Object>> buffer;
3838
private final HttpConsumer httpConsumer;
39+
private final InstantHttpConsumer instantHttpConsumer;
3940
private final ObjectMapper jsonMapper;
4041
private final Callback callback;
4142
private final int bulkSize;
4243
private final ScheduledExecutorService executorService;
44+
private List<String> instantEvents;
45+
private boolean isInstantStatus;
4346

4447
public FastBatchConsumer(@NonNull String serverUrl, @NonNull Callback callback) {
4548
this(serverUrl, false, callback);
@@ -69,12 +72,21 @@ public FastBatchConsumer(@NonNull String serverUrl, final boolean timing, final
6972

7073
public FastBatchConsumer(HttpClientBuilder httpClientBuilder, @NonNull String serverUrl, final boolean timing, final int bulkSize, int maxCacheSize,
7174
int flushSec, int timeoutSec, @NonNull Callback callback) {
75+
this(httpClientBuilder, serverUrl, timing, bulkSize, maxCacheSize, flushSec, timeoutSec, callback, new ArrayList<String>());
76+
}
77+
78+
public FastBatchConsumer(HttpClientBuilder httpClientBuilder, @NonNull String serverUrl, final boolean timing, final int bulkSize, int maxCacheSize,
79+
int flushSec, int timeoutSec, @NonNull Callback callback, List<String> instantEvents) {
7280
this.buffer =
7381
new LinkedBlockingQueue<>(Math.min(Math.max(MIN_CACHE_SIZE, maxCacheSize), MAX_CACHE_SIZE));
7482
this.httpConsumer = new HttpConsumer(httpClientBuilder, serverUrl, Math.max(timeoutSec, 1));
83+
this.instantHttpConsumer = new InstantHttpConsumer(httpClientBuilder, serverUrl, Math.max(timeoutSec, 1));
84+
7585
this.jsonMapper = SensorsAnalyticsUtil.getJsonObjectMapper();
7686
this.callback = callback;
7787
this.bulkSize = Math.min(MIN_CACHE_SIZE, Math.max(bulkSize, MIN_BULK_SIZE));
88+
this.instantEvents = instantEvents;
89+
7890
executorService = new ScheduledThreadPoolExecutor(1);
7991
executorService.scheduleWithFixedDelay(new Runnable() {
8092
@Override
@@ -95,15 +107,33 @@ public void run() {
95107

96108
@Override
97109
public void send(Map<String, Object> message) {
98-
if (!buffer.offer(message)) {
99-
List<Map<String, Object>> res = new ArrayList<>(1);
100-
res.add(message);
101-
callback.onFailed(new FailedData("can't offer to buffer.", res));
102-
log.error("Failed to load data into the cache.The cache current size is {}.", buffer.size());
110+
dealInstantSignal(message);
111+
if (buffer.remainingCapacity() == 0) {
112+
flush();
103113
}
114+
buffer.offer(message);
104115
log.info("Successfully save data to cache.The cache current size is {}.", buffer.size());
105116
}
106117

118+
private void dealInstantSignal(Map<String, Object> message) {
119+
120+
/*
121+
* 如果当前是「instant」状态,且(message中不包含event 或者 event 不是「instant」的,则刷新,设置 「非instant」状态
122+
*/
123+
if (isInstantStatus && (!message.containsKey("event") || !instantEvents.contains(message.get("event")))) {
124+
flush();
125+
isInstantStatus = false;
126+
}
127+
128+
/*
129+
* 如果当前是 「非instant」状态,且(message中包含event 且 event 是「instant」的,则刷新,设置 「instant」状态
130+
*/
131+
if (!isInstantStatus && message.containsKey("event") && instantEvents.contains(message.get("event"))) {
132+
flush();
133+
isInstantStatus = true;
134+
}
135+
}
136+
107137
/**
108138
* This method don't need to be called actively.Because instance will create scheduled thread to do.
109139
*/
@@ -130,7 +160,11 @@ public void flush() {
130160
}
131161
log.debug("Data will be sent.{}", sendingData);
132162
try {
133-
this.httpConsumer.consume(sendingData);
163+
if (isInstantStatus) {
164+
this.instantHttpConsumer.consume(sendingData);
165+
} else {
166+
this.httpConsumer.consume(sendingData);
167+
}
134168
} catch (Exception e) {
135169
log.error("Failed to send data:{}.", sendingData, e);
136170
callback.onFailed(new FailedData(String.format("failed to send data,message:%s.", e.getMessage()),

SensorsAnalyticsSDK/src/main/java/com/sensorsdata/analytics/javasdk/consumer/HttpConsumer.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ HttpUriRequest getHttpRequest(final String data) throws IOException {
104104
}
105105

106106
UrlEncodedFormEntity getHttpEntry(final String data) throws IOException {
107+
List<NameValuePair> nameValuePairs = getNameValuePairs(data);
108+
return new UrlEncodedFormEntity(nameValuePairs);
109+
}
110+
111+
List<NameValuePair> getNameValuePairs(String data) throws IOException {
112+
107113
byte[] bytes = data.getBytes(Charset.forName("UTF-8"));
108114

109115
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
@@ -118,14 +124,14 @@ UrlEncodedFormEntity getHttpEntry(final String data) throws IOException {
118124

119125
nameValuePairs.add(new BasicNameValuePair("gzip", "1"));
120126
nameValuePairs.add(new BasicNameValuePair("data_list", new String(Base64Coder.encode
121-
(compressed))));
127+
(compressed))));
122128
} else {
123129
nameValuePairs.add(new BasicNameValuePair("gzip", "0"));
124130
nameValuePairs.add(new BasicNameValuePair("data_list", new String(Base64Coder.encode
125-
(bytes))));
131+
(bytes))));
126132
}
127133

128-
return new UrlEncodedFormEntity(nameValuePairs);
134+
return nameValuePairs;
129135
}
130136

131137
@Override
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.sensorsdata.analytics.javasdk.consumer;
2+
3+
import org.apache.http.NameValuePair;
4+
import org.apache.http.client.entity.UrlEncodedFormEntity;
5+
import org.apache.http.impl.client.HttpClientBuilder;
6+
import org.apache.http.message.BasicNameValuePair;
7+
8+
import java.io.IOException;
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
public class InstantHttpConsumer extends HttpConsumer{
13+
14+
public InstantHttpConsumer(String serverUrl, int timeoutSec) {
15+
super(serverUrl, timeoutSec);
16+
}
17+
18+
public InstantHttpConsumer(String serverUrl, Map<String, String> httpHeaders) {
19+
super(serverUrl, httpHeaders);
20+
}
21+
22+
InstantHttpConsumer(String serverUrl, Map<String, String> httpHeaders, int timeoutSec) {
23+
super(serverUrl, httpHeaders, timeoutSec);
24+
}
25+
26+
public InstantHttpConsumer(HttpClientBuilder httpClientBuilder, String serverUrl,
27+
Map<String, String> httpHeaders) {
28+
super(httpClientBuilder, serverUrl, httpHeaders);
29+
}
30+
31+
public InstantHttpConsumer(HttpClientBuilder httpClientBuilder, String serverUrl, int timeoutSec) {
32+
super(httpClientBuilder, serverUrl, timeoutSec);
33+
}
34+
35+
InstantHttpConsumer(HttpClientBuilder httpClientBuilder, String serverUrl, Map<String, String> httpHeaders,
36+
int timeoutSec) {
37+
super(httpClientBuilder, serverUrl, httpHeaders, timeoutSec);
38+
}
39+
40+
@Override
41+
UrlEncodedFormEntity getHttpEntry(final String data) throws IOException {
42+
List<NameValuePair> nameValuePairs = getNameValuePairs(data);
43+
nameValuePairs.add(new BasicNameValuePair("instant_event", "true"));
44+
return new UrlEncodedFormEntity(nameValuePairs);
45+
}
46+
}

0 commit comments

Comments
 (0)