@@ -94,38 +94,62 @@ public long getMessageCount() {
94
94
*/
95
95
@ Override
96
96
public MessageGroup getMessageGroup (Object groupId ) {
97
- return buildMessageGroup (groupId , false );
98
- }
97
+ MessageGroupMetadata metadata = getGroupMetadata (groupId );
98
+ if ( metadata != null ) {
99
99
100
+ MessageGroup messageGroup = getMessageGroupFactory ()
101
+ .create (this , groupId , metadata .getTimestamp (), metadata .isComplete ());
102
+ messageGroup .setLastModified (metadata .getLastModified ());
103
+ messageGroup .setLastReleasedMessageSequenceNumber (metadata .getLastReleasedMessageSequenceNumber ());
104
+ return messageGroup ;
105
+ }
106
+ else {
107
+ return new SimpleMessageGroup (groupId );
108
+ }
109
+ }
100
110
101
- /**
102
- * Add a Message to the group with the provided group ID.
103
- */
104
111
@ Override
105
- public MessageGroup addMessageToGroup (Object groupId , Message <?> message ) {
112
+ public MessageGroupMetadata getGroupMetadata (Object groupId ) {
106
113
Assert .notNull (groupId , "'groupId' must not be null" );
107
- Assert .notNull (message , "'message' must not be null" );
114
+ Object mgm = this .doRetrieve (MESSAGE_GROUP_KEY_PREFIX + groupId );
115
+ if (mgm != null ) {
116
+ Assert .isInstanceOf (MessageGroupMetadata .class , mgm );
117
+ return (MessageGroupMetadata ) mgm ;
118
+ }
119
+ return null ;
120
+ }
108
121
109
- // add message as is to the MG accessible by the caller
110
- MessageGroup messageGroup = getMessageGroup (groupId );
122
+ @ Override
123
+ public void addMessagesToGroup (Object groupId , Message <?>... messages ) {
124
+ Assert .notNull (groupId , "'groupId' must not be null" );
125
+ Assert .notNull (messages , "'messages' must not be null" );
111
126
112
- messageGroup .add (message );
127
+ MessageGroupMetadata metadata = getGroupMetadata (groupId );
128
+ SimpleMessageGroup group = null ;
129
+ if (metadata == null ) {
130
+ group = new SimpleMessageGroup (groupId );
131
+ }
113
132
114
- // enrich Message with additional headers and add it to MS
115
- Message <?> enrichedMessage = enrichMessage (message );
133
+ for (Message <?> message : messages ) {
134
+ // enrich Message with additional headers and add it to MS
135
+ Message <?> enrichedMessage = enrichMessage (message );
136
+ addMessage (enrichedMessage );
137
+ if (metadata != null ) {
138
+ metadata .add (enrichedMessage .getHeaders ().getId ());
139
+ }
140
+ else {
141
+ group .add (enrichedMessage );
142
+ }
143
+ }
116
144
117
- addMessage (enrichedMessage );
145
+ if (group != null ) {
146
+ metadata = new MessageGroupMetadata (group );
147
+ }
118
148
119
- // build raw MessageGroup and add enriched Message to it
120
- MessageGroup rawGroup = buildMessageGroup (groupId , true );
121
- rawGroup .setLastModified (System .currentTimeMillis ());
122
- rawGroup .add (enrichedMessage );
149
+ metadata .setLastModified (System .currentTimeMillis ());
123
150
124
151
// store MessageGroupMetadata built from enriched MG
125
- doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , new MessageGroupMetadata (rawGroup ));
126
-
127
- // return clean MG
128
- return getMessageGroup (groupId );
152
+ doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , metadata );
129
153
}
130
154
131
155
/**
@@ -137,32 +161,17 @@ public MessageGroup removeMessageFromGroup(Object groupId, Message<?> messageToR
137
161
Assert .notNull (groupId , "'groupId' must not be null" );
138
162
Assert .notNull (messageToRemove , "'messageToRemove' must not be null" );
139
163
140
- // build raw MG
141
- MessageGroup rawGroup = buildMessageGroup (groupId , true );
142
-
143
- // create a clean instance of
144
- MessageGroup messageGroup = normalizeSimpleMessageGroup (rawGroup );
145
-
146
-
147
- Message <?> actualMessageToRemove = null ;
148
-
149
- for (Message <?> message : rawGroup .getMessages ()) {
150
- if (message .getHeaders ().getId ().equals (messageToRemove .getHeaders ().getId ())) {
151
- actualMessageToRemove = message ;
152
- break ;
153
- }
154
- }
155
-
156
- if (actualMessageToRemove != null ) {
157
- rawGroup .remove (actualMessageToRemove );
158
- removeMessage (messageToRemove .getHeaders ().getId ());
159
- rawGroup .setLastModified (System .currentTimeMillis ());
164
+ UUID id = messageToRemove .getHeaders ().getId ();
165
+ removeMessage (id );
160
166
161
- doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , new MessageGroupMetadata (rawGroup ));
162
- messageGroup = getMessageGroup (groupId );
167
+ MessageGroupMetadata metadata = getGroupMetadata (groupId );
168
+ if (metadata != null ) {
169
+ metadata .remove (id );
170
+ metadata .setLastModified (System .currentTimeMillis ());
171
+ doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , metadata );
163
172
}
164
173
165
- return messageGroup ;
174
+ return getMessageGroup ( groupId ) ;
166
175
}
167
176
168
177
@@ -188,10 +197,12 @@ public void removeMessagesFromGroup(Object groupId, Collection<Message<?>> messa
188
197
@ Override
189
198
public void completeGroup (Object groupId ) {
190
199
Assert .notNull (groupId , "'groupId' must not be null" );
191
- MessageGroup messageGroup = buildMessageGroup (groupId , true );
192
- messageGroup .complete ();
193
- messageGroup .setLastModified (System .currentTimeMillis ());
194
- doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , new MessageGroupMetadata (messageGroup ));
200
+ MessageGroupMetadata metadata = getGroupMetadata (groupId );
201
+ if (metadata != null ) {
202
+ metadata .complete ();
203
+ metadata .setLastModified (System .currentTimeMillis ());
204
+ doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , metadata );
205
+ }
195
206
}
196
207
197
208
/**
@@ -215,37 +226,62 @@ public void removeMessageGroup(Object groupId) {
215
226
@ Override
216
227
public void setLastReleasedSequenceNumberForGroup (Object groupId , int sequenceNumber ) {
217
228
Assert .notNull (groupId , "'groupId' must not be null" );
218
- MessageGroup messageGroup = buildMessageGroup (groupId , true );
219
- messageGroup .setLastReleasedMessageSequenceNumber (sequenceNumber );
220
- messageGroup .setLastModified (System .currentTimeMillis ());
221
- doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , new MessageGroupMetadata (messageGroup ));
229
+ MessageGroupMetadata metadata = getGroupMetadata (groupId );
230
+ if (metadata == null ) {
231
+ SimpleMessageGroup messageGroup = new SimpleMessageGroup (groupId );
232
+ metadata = new MessageGroupMetadata (messageGroup );
233
+ }
234
+ metadata .setLastReleasedMessageSequenceNumber (sequenceNumber );
235
+ metadata .setLastModified (System .currentTimeMillis ());
236
+ doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , metadata );
222
237
}
223
238
224
239
@ Override
225
240
public Message <?> pollMessageFromGroup (Object groupId ) {
226
- Assert .notNull (groupId , "'groupId' must not be null" );
227
- Object mgm = doRetrieve (MESSAGE_GROUP_KEY_PREFIX + groupId );
228
- if (mgm != null ) {
229
- Assert .isInstanceOf (MessageGroupMetadata .class , mgm );
230
- MessageGroupMetadata messageGroupMetadata = (MessageGroupMetadata ) mgm ;
231
-
232
- UUID firstId = messageGroupMetadata .firstId ();
241
+ MessageGroupMetadata groupMetadata = getGroupMetadata (groupId );
242
+ if (groupMetadata != null ) {
243
+ UUID firstId = groupMetadata .firstId ();
233
244
if (firstId != null ) {
234
- messageGroupMetadata .remove (firstId );
235
- messageGroupMetadata .setLastModified (System .currentTimeMillis ());
236
- doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , messageGroupMetadata );
245
+ groupMetadata .remove (firstId );
246
+ groupMetadata .setLastModified (System .currentTimeMillis ());
247
+ doStore (MESSAGE_GROUP_KEY_PREFIX + groupId , groupMetadata );
237
248
return removeMessage (firstId );
238
249
}
239
250
}
240
251
return null ;
241
252
}
242
253
254
+ @ Override
255
+ public Message <?> getOneMessageFromGroup (Object groupId ) {
256
+ MessageGroupMetadata groupMetadata = getGroupMetadata (groupId );
257
+ if (groupMetadata != null ) {
258
+ UUID messageId = groupMetadata .firstId ();
259
+ if (messageId != null ) {
260
+ return getMessage (messageId );
261
+ }
262
+ }
263
+ return null ;
264
+ }
265
+
266
+ @ Override
267
+ public Collection <Message <?>> getMessagesForGroup (Object groupId ) {
268
+ MessageGroupMetadata groupMetadata = getGroupMetadata (groupId );
269
+ ArrayList <Message <?>> messages = new ArrayList <Message <?>>();
270
+ if (groupMetadata != null ) {
271
+ Iterator <UUID > messageIds = groupMetadata .messageIdIterator ();
272
+ while (messageIds .hasNext ()) {
273
+ messages .add (getMessage (messageIds .next ()));
274
+ }
275
+ }
276
+ return messages ;
277
+ }
278
+
243
279
@ Override
244
280
@ SuppressWarnings ("unchecked" )
245
281
public Iterator <MessageGroup > iterator () {
246
282
final Iterator <?> idIterator = normalizeKeys (
247
283
(Collection <String >) doListKeys (MESSAGE_GROUP_KEY_PREFIX + "*" ))
248
- .iterator ();
284
+ .iterator ();
249
285
return new MessageGroupIterator (idIterator );
250
286
}
251
287
@@ -266,13 +302,13 @@ else if (strKey.startsWith(MESSAGE_KEY_PREFIX)) {
266
302
267
303
@ Override
268
304
public int messageGroupSize (Object groupId ) {
269
- Object mgm = doRetrieve ( MESSAGE_GROUP_KEY_PREFIX + groupId );
305
+ MessageGroupMetadata mgm = getGroupMetadata ( groupId );
270
306
if (mgm != null ) {
271
- Assert .isInstanceOf (MessageGroupMetadata .class , mgm );
272
- MessageGroupMetadata messageGroupMetadata = (MessageGroupMetadata ) mgm ;
273
- return messageGroupMetadata .size ();
307
+ return mgm .size ();
308
+ }
309
+ else {
310
+ return 0 ;
274
311
}
275
- return 0 ;
276
312
}
277
313
278
314
protected abstract Object doRetrieve (Object id );
@@ -308,48 +344,6 @@ private Message<?> enrichMessage(Message<?> message) {
308
344
return enrichedMessage ;
309
345
}
310
346
311
- private MessageGroup buildMessageGroup (Object groupId , boolean raw ) {
312
- Assert .notNull (groupId , "'groupId' must not be null" );
313
- Object mgm = doRetrieve (MESSAGE_GROUP_KEY_PREFIX + groupId );
314
- if (mgm != null ) {
315
- Assert .isInstanceOf (MessageGroupMetadata .class , mgm );
316
- MessageGroupMetadata messageGroupMetadata = (MessageGroupMetadata ) mgm ;
317
- ArrayList <Message <?>> messages = new ArrayList <Message <?>>();
318
-
319
- Iterator <UUID > messageIds = messageGroupMetadata .messageIdIterator ();
320
- while (messageIds .hasNext ()) {
321
- UUID next = messageIds .next ();
322
- if (next != null ) {
323
- if (raw ) {
324
- messages .add (getRawMessage (next ));
325
- }
326
- else {
327
- messages .add (getMessage (next ));
328
- }
329
- }
330
- }
331
-
332
- MessageGroup messageGroup = getMessageGroupFactory ()
333
- .create (messages , groupId , messageGroupMetadata .getTimestamp (), messageGroupMetadata .isComplete ());
334
- messageGroup .setLastModified (messageGroupMetadata .getLastModified ());
335
- messageGroup .setLastReleasedMessageSequenceNumber (
336
- messageGroupMetadata .getLastReleasedMessageSequenceNumber ());
337
- return messageGroup ;
338
- }
339
- else {
340
- return getMessageGroupFactory ().create (groupId );
341
- }
342
- }
343
-
344
- private MessageGroup normalizeSimpleMessageGroup (MessageGroup messageGroup ) {
345
- MessageGroup normalizedGroup = getMessageGroupFactory ().create (messageGroup .getGroupId ());
346
- for (Message <?> message : messageGroup .getMessages ()) {
347
- Message <?> normalizedMessage = normalizeMessage (message );
348
- normalizedGroup .add (normalizedMessage );
349
- }
350
- return normalizedGroup ;
351
- }
352
-
353
347
private Message <?> getRawMessage (UUID id ) {
354
348
Assert .notNull (id , "'id' must not be null" );
355
349
Object message = doRetrieve (MESSAGE_KEY_PREFIX + id );
@@ -380,4 +374,5 @@ public void remove() {
380
374
throw new UnsupportedOperationException ();
381
375
}
382
376
}
377
+
383
378
}
0 commit comments