Skip to content

Commit 8cf71f9

Browse files
authored
Merge pull request #652 from philipwhiuk/boundedQueue
Add a bounded-size version of the in-memory message queue
2 parents 0998dad + 1dc797e commit 8cf71f9

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package quickfix;
2+
3+
import java.util.LinkedHashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.stream.Collectors;
7+
8+
/**
9+
* A bounded-size version of InMemoryMessageQueue.
10+
* @see InMemoryMessageQueue
11+
*/
12+
public class BoundInMemoryMessageQueue implements MessageQueue {
13+
// The map should be accessed from a single thread
14+
private final Map<Integer, Message> backingMap = new LinkedHashMap<>();
15+
private final int maxSize;
16+
17+
public BoundInMemoryMessageQueue(int maxSize) {
18+
this.maxSize = maxSize;
19+
}
20+
21+
public void enqueue(int sequence, Message message) {
22+
if (backingMap.size() >= maxSize) {
23+
List<Integer> keys = backingMap.keySet().stream().sorted().collect(Collectors.toList());
24+
if (sequence < keys.get(0)) {
25+
backingMap.remove(keys.get(keys.size()-1));
26+
backingMap.put(sequence, message);
27+
}
28+
} else {
29+
this.backingMap.put(sequence, message);
30+
}
31+
}
32+
33+
public Message dequeue(int sequence) {
34+
return (Message) this.backingMap.remove(sequence);
35+
}
36+
37+
public void clear() {
38+
this.backingMap.clear();
39+
}
40+
41+
Map<Integer, Message> getBackingMap() {
42+
return this.backingMap;
43+
}
44+
}
45+

0 commit comments

Comments
 (0)