24
24
import org .slf4j .Logger ;
25
25
import org .slf4j .LoggerFactory ;
26
26
27
- import java .io .Serializable ;
28
27
import java .util .ArrayList ;
29
28
import java .util .Collections ;
30
29
import java .util .HashSet ;
@@ -53,7 +52,7 @@ public class UUIDBroadcasterCache implements BroadcasterCache {
53
52
54
53
private final static Logger logger = LoggerFactory .getLogger (UUIDBroadcasterCache .class );
55
54
56
- private final Map <String , ClientQueue > messages = new ConcurrentHashMap <String , ClientQueue >();
55
+ private final Map <String , ConcurrentLinkedQueue > messages = new ConcurrentHashMap <String , ConcurrentLinkedQueue >();
57
56
private final Map <String , Long > activeClients = new ConcurrentHashMap <String , Long >();
58
57
protected final List <BroadcasterCacheInspector > inspectors = new LinkedList <BroadcasterCacheInspector >();
59
58
private ScheduledFuture scheduledFuture ;
@@ -65,30 +64,6 @@ public class UUIDBroadcasterCache implements BroadcasterCache {
65
64
protected final List <BroadcasterCacheListener > listeners = new LinkedList <BroadcasterCacheListener >();
66
65
private UUIDProvider uuidProvider ;
67
66
68
- /**
69
- * This class wraps all messages to be delivered to a client. The class is thread safe to be accessed in a
70
- * concurrent context.
71
- */
72
- public final static class ClientQueue implements Serializable {
73
- private static final long serialVersionUID = -126253550299206646L ;
74
-
75
- private final ConcurrentLinkedQueue <CacheMessage > queue = new ConcurrentLinkedQueue <CacheMessage >();
76
- private final Set <String > ids = Collections .synchronizedSet (new HashSet <String >());
77
-
78
- public ConcurrentLinkedQueue <CacheMessage > getQueue () {
79
- return queue ;
80
- }
81
-
82
- public Set <String > getIds () {
83
- return ids ;
84
- }
85
-
86
- @ Override
87
- public String toString () {
88
- return queue .toString ();
89
- }
90
- }
91
-
92
67
@ Override
93
68
public void configure (AtmosphereConfig config ) {
94
69
Object o = config .properties ().get ("shared" );
@@ -156,7 +131,7 @@ public CacheMessage addToCache(String broadcasterId, String uuid, BroadcastMessa
156
131
cache = false ;
157
132
}
158
133
159
- CacheMessage cacheMessage = new CacheMessage (messageId , message .message (), uuid );;
134
+ CacheMessage cacheMessage = new CacheMessage (messageId , message .message (), uuid );
160
135
if (cache ) {
161
136
if (uuid .equals (NULL )) {
162
137
//no clients are connected right now, caching message for all active clients
@@ -174,38 +149,33 @@ public CacheMessage addToCache(String broadcasterId, String uuid, BroadcastMessa
174
149
@ Override
175
150
public List <Object > retrieveFromCache (String broadcasterId , String uuid ) {
176
151
152
+ ConcurrentLinkedQueue <CacheMessage > clientQueue = messages .get (uuid );
153
+ CacheMessage message ;
177
154
List <Object > result = new ArrayList <Object >();
178
-
179
- ClientQueue clientQueue ;
180
- cacheCandidate (broadcasterId , uuid );
181
- clientQueue = messages .remove (uuid );
182
- ConcurrentLinkedQueue <CacheMessage > clientMessages ;
183
- if (clientQueue != null ) {
184
- clientMessages = clientQueue .getQueue ();
185
-
186
- for (CacheMessage cacheMessage : clientMessages ) {
187
- result .add (cacheMessage .getMessage ());
188
- }
155
+ if (clientQueue == null ) {
156
+ logger .debug ("client queue is null (not yet created), hence returning back for broadcaster %s and uuid %s" ,
157
+ broadcasterId , uuid );
158
+ return result ;
189
159
}
190
160
191
- if (logger .isTraceEnabled ()) {
192
- logger .trace ("Retrieved for AtmosphereResource {} cached messages {}" , uuid , result );
193
- logger .trace ("Available cached message {}" , messages );
161
+ while ((message = clientQueue .poll ()) != null ) {
162
+ result .add (message );
194
163
}
195
164
196
165
return result ;
197
166
}
198
167
199
168
@ Override
200
169
public BroadcasterCache clearCache (String broadcasterId , String uuid , CacheMessage message ) {
201
- ClientQueue clientQueue ;
202
- clientQueue = messages .get (uuid );
203
- if (clientQueue != null ) {
204
- logger .trace ("Removing for AtmosphereResource {} cached message {}" , uuid , message .getMessage ());
205
- notifyRemoveCache (broadcasterId , message );
206
- clientQueue .getQueue ().remove (message );
207
- clientQueue .getIds ().remove (message .getId ());
170
+ ConcurrentLinkedQueue <CacheMessage > clientQueue = messages .remove (uuid );
171
+
172
+ if (clientQueue == null ) {
173
+ logger .error ("Invalid State, no Queue available" );
174
+ return this ;
208
175
}
176
+
177
+ logger .trace ("Removing for AtmosphereResource {} cached message {}" , uuid , message .getMessage ());
178
+ notifyRemoveCache (broadcasterId , message );
209
179
return this ;
210
180
}
211
181
@@ -240,21 +210,22 @@ private void addMessageIfNotExists(String broadcasterId, String clientId, CacheM
240
210
}
241
211
242
212
private void addMessage (String broadcasterId , String clientId , CacheMessage message ) {
243
- ClientQueue clientQueue = messages .get (clientId );
213
+ ConcurrentLinkedQueue clientQueue = messages .get (clientId );
244
214
if (clientQueue == null ) {
245
- clientQueue = new ClientQueue ();
246
- // Make sure the client is not in the process of being invalidated
247
- if (activeClients .get (clientId ) != null ) {
248
- messages .put (clientId , clientQueue );
249
- } else {
250
- // The entry has been invalidated
251
- logger .debug ("Client {} is no longer active. Not caching message {}}" , clientId , message );
252
- return ;
215
+ synchronized (message ) {
216
+ clientQueue = new ConcurrentLinkedQueue ();
217
+ // Make sure the client is not in the process of being invalidated
218
+ if (activeClients .get (clientId ) != null ) {
219
+ messages .put (clientId , clientQueue );
220
+ } else {
221
+ // The entry has been invalidated
222
+ logger .debug ("Client {} is no longer active. Not caching message {}}" , clientId , message );
223
+ return ;
224
+ }
253
225
}
254
226
}
255
227
notifyAddCache (broadcasterId , message );
256
- clientQueue .getQueue ().offer (message );
257
- clientQueue .getIds ().add (message .getId ());
228
+ messages .put (clientId , clientQueue );
258
229
}
259
230
260
231
private void notifyAddCache (String broadcasterId , CacheMessage message ) {
@@ -278,11 +249,11 @@ private void notifyRemoveCache(String broadcasterId, CacheMessage message) {
278
249
}
279
250
280
251
private boolean hasMessage (String clientId , String messageId ) {
281
- ClientQueue clientQueue = messages .get (clientId );
282
- return clientQueue != null && clientQueue .getIds (). contains (messageId );
252
+ ConcurrentLinkedQueue clientQueue = messages .get (clientId );
253
+ return clientQueue != null && clientQueue .contains (messageId );
283
254
}
284
255
285
- public Map <String , ClientQueue > messages () {
256
+ public Map <String , ConcurrentLinkedQueue > messages () {
286
257
return messages ;
287
258
}
288
259
@@ -325,7 +296,7 @@ protected void invalidateExpiredEntries() {
325
296
326
297
for (String msg : messages ().keySet ()) {
327
298
if (!activeClients ().containsKey (msg )) {
328
- messages () .remove (msg );
299
+ messages .remove (msg );
329
300
}
330
301
}
331
302
}
0 commit comments