7
7
import java .nio .charset .StandardCharsets ;
8
8
import java .util .ArrayList ;
9
9
import java .util .List ;
10
+ import java .util .Timer ;
11
+ import java .util .TimerTask ;
12
+ import java .util .concurrent .ThreadLocalRandom ;
10
13
11
14
public class ClusterWS {
12
15
private Socket mSocket ;
@@ -17,20 +20,30 @@ public class ClusterWS {
17
20
private MessageHandler mMessageHandler ;
18
21
private PingHandler mPingHandler ;
19
22
private List <Channel > mChannels ;
20
- private ReconnectionHandler mReconnectionHandler ;
23
+ private ReconnectionParams mReconnectionParams ;
21
24
22
25
public ClusterWS (String url ) {
23
- if (url == null ){
26
+ if (url == null ) {
24
27
throw new NullPointerException ("Url must be provided" );
25
28
}
26
29
mUrl = url ;
27
30
mChannels = new ArrayList <>();
28
- mReconnectionHandler = new ReconnectionHandler (null , null , null , null , this );
31
+ mReconnectionParams = new ReconnectionParams (
32
+ false ,
33
+ null ,
34
+ null ,
35
+ null );
29
36
createSocket ();
30
37
}
31
38
32
- public ClusterWS setReconnection (Boolean autoReconnect , Integer reconnectionIntervalMin , Integer reconnectionIntervalMax , Integer reconnectionAttempts ) {
33
- mReconnectionHandler = new ReconnectionHandler (autoReconnect , reconnectionIntervalMin , reconnectionIntervalMax , reconnectionAttempts , this );
39
+ public ClusterWS setReconnection (Boolean autoReconnect ,
40
+ Integer reconnectionIntervalMin ,
41
+ Integer reconnectionIntervalMax ,
42
+ Integer reconnectionAttempts ) {
43
+ mReconnectionParams = new ReconnectionParams (autoReconnect ,
44
+ reconnectionIntervalMin ,
45
+ reconnectionIntervalMax ,
46
+ reconnectionAttempts );
34
47
return this ;
35
48
}
36
49
@@ -53,7 +66,7 @@ public void on(String event, IEmitterListener listener) {
53
66
}
54
67
55
68
public void send (String event , Object data ) {
56
- send (event ,data ,"emit" );
69
+ send (event , data , "emit" );
57
70
}
58
71
59
72
public WebSocket .READYSTATE getState () {
@@ -117,7 +130,7 @@ private void createSocket() {
117
130
mSocket = new Socket (URI .create (mUrl ), new ISocketEvents () {
118
131
@ Override
119
132
public void onOpen () {
120
- mReconnectionHandler . onOpen ();
133
+ mClusterWSListener . onConnected ();
121
134
}
122
135
123
136
@ Override
@@ -132,17 +145,22 @@ public void onClose(int code, String reason) {
132
145
if (mPingHandler .getPingTimer () != null ) {
133
146
mPingHandler .getPingTimer ().cancel ();
134
147
}
135
-
136
- if (mReconnectionHandler .isInReconnectionState ()) {
137
- return ;
138
- }
139
- if (mReconnectionHandler .isAutoReconnect () && code != 1000 ) {
140
- mReconnectionHandler .reconnect ();
141
- }
142
-
143
- if (mClusterWSListener != null ) {
144
- mClusterWSListener .onDisconnected (code , reason );
148
+ if (mReconnectionParams .isAutoReconnect () && code != 1000 && (mReconnectionParams .getReconnectionAttempts () == 0 || mReconnectionParams .getReconnectionsAttempted () < mReconnectionParams .getReconnectionAttempts ())) {
149
+ if (mSocket .getReadyState () == WebSocket .READYSTATE .CLOSED || mSocket .getReadyState () == WebSocket .READYSTATE .NOT_YET_CONNECTED ) {
150
+ mReconnectionParams .incrementReconnectionsAttempted ();
151
+ int randomDelay = ThreadLocalRandom .current ().nextInt (1 ,
152
+ mReconnectionParams .getReconnectionIntervalMax () -
153
+ mReconnectionParams .getReconnectionIntervalMin () +
154
+ 1 );
155
+ new Timer ().schedule (new TimerTask () {
156
+ @ Override
157
+ public void run () {
158
+ connect ();
159
+ }
160
+ }, randomDelay );
161
+ }
145
162
}
163
+ mClusterWSListener .onDisconnected (code , reason );
146
164
}
147
165
148
166
@ Override
@@ -170,5 +188,4 @@ private void onMessageReceived(String message) {
170
188
mMessageHandler .messageDecode (ClusterWS .this , message );
171
189
}
172
190
}
173
-
174
191
}
0 commit comments