Skip to content

Commit 7a97eb6

Browse files
authored
GH-3336: Change MongoDb Store sequence to long (#3385)
* GH-3336: Change MongoDb Store sequence to long Fixes #3336 Turns out there are some scenarios where too many messages are transferred through the message store, so `int` for sequence is not enough as a type * Change sequence to `long` to widen a sequence lifespan * * Change MongoDb store to deal with `Number.longValue()` instead of casting which doesn't work from `Integer` to `Long`. This way we can keep an old sequence document with an `int` type for value * Documents with new `long` type for their sequence field are OK. The `NumberToNumberConverter` has an effect converting `int` to `long` properly.
1 parent 7f33085 commit 7a97eb6

File tree

4 files changed

+38
-27
lines changed

4 files changed

+38
-27
lines changed

spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,15 @@ public void afterPropertiesSet() {
150150

151151
indexOperations.ensureIndex(new Index(MessageDocumentFields.MESSAGE_ID, Sort.Direction.ASC));
152152

153-
indexOperations.ensureIndex(new Index(MessageDocumentFields.GROUP_ID, Sort.Direction.ASC)
154-
.on(MessageDocumentFields.MESSAGE_ID, Sort.Direction.ASC)
155-
.unique());
156-
157-
indexOperations.ensureIndex(new Index(MessageDocumentFields.GROUP_ID, Sort.Direction.ASC)
158-
.on(MessageDocumentFields.LAST_MODIFIED_TIME, Sort.Direction.DESC)
159-
.on(MessageDocumentFields.SEQUENCE, Sort.Direction.DESC));
153+
indexOperations.ensureIndex(
154+
new Index(MessageDocumentFields.GROUP_ID, Sort.Direction.ASC)
155+
.on(MessageDocumentFields.MESSAGE_ID, Sort.Direction.ASC)
156+
.unique());
157+
158+
indexOperations.ensureIndex(
159+
new Index(MessageDocumentFields.GROUP_ID, Sort.Direction.ASC)
160+
.on(MessageDocumentFields.LAST_MODIFIED_TIME, Sort.Direction.DESC)
161+
.on(MessageDocumentFields.SEQUENCE, Sort.Direction.DESC));
160162
}
161163

162164
public Message<?> getMessage(UUID id) {
@@ -198,14 +200,15 @@ public int messageGroupSize(Object groupId) {
198200
* The {@link #SEQUENCE_NAME} document is created on demand.
199201
* @return the next sequence value.
200202
*/
201-
protected int getNextId() {
203+
protected long getNextId() {
202204
Query query = Query.query(Criteria.where("_id").is(SEQUENCE_NAME));
203205
query.fields().include(MessageDocumentFields.SEQUENCE);
204-
return (Integer) this.mongoTemplate.findAndModify(query,
205-
new Update().inc(MessageDocumentFields.SEQUENCE, 1),
206+
return ((Number) this.mongoTemplate.findAndModify(query,
207+
new Update().inc(MessageDocumentFields.SEQUENCE, 1L),
206208
FindAndModifyOptions.options().returnNew(true).upsert(true),
207209
Map.class, this.collectionName)
208-
.get(MessageDocumentFields.SEQUENCE); // NOSONAR - never returns null
210+
.get(MessageDocumentFields.SEQUENCE)) // NOSONAR - never returns null
211+
.longValue();
209212
}
210213

211214
protected void addMessageDocument(final MessageDocument document) {

spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MessageDocument.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2019 the original author or authors.
2+
* Copyright 2014-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -61,7 +61,7 @@ public class MessageDocument {
6161

6262
private Integer lastReleasedSequence = 0;
6363

64-
private int sequence;
64+
private long sequence;
6565

6666
public MessageDocument(Message<?> message) {
6767
this(message, message.getHeaders().getId());
@@ -139,7 +139,7 @@ public void setLastReleasedSequence(int lastReleasedSequence) {
139139
this.lastReleasedSequence = lastReleasedSequence;
140140
}
141141

142-
public void setSequence(int sequence) {
142+
public void setSequence(long sequence) {
143143
this.sequence = sequence;
144144
}
145145

@@ -151,7 +151,7 @@ public Object getGroupId() {
151151
return this.groupId;
152152
}
153153

154-
public int getSequence() {
154+
public long getSequence() {
155155
return this.sequence;
156156
}
157157

spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbChannelMessageStore.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
public class MongoDbChannelMessageStore extends AbstractConfigurableMongoDbMessageStore
5050
implements PriorityCapableChannelMessageStore {
5151

52+
/**
53+
* The default conventional collection name.
54+
*/
5255
public static final String DEFAULT_COLLECTION_NAME = "channelMessages";
5356

5457
private boolean priorityEnabled;
@@ -65,7 +68,9 @@ public MongoDbChannelMessageStore(MongoDatabaseFactory mongoDbFactory) {
6568
this(mongoDbFactory, null, DEFAULT_COLLECTION_NAME);
6669
}
6770

68-
public MongoDbChannelMessageStore(MongoDatabaseFactory mongoDbFactory, MappingMongoConverter mappingMongoConverter) {
71+
public MongoDbChannelMessageStore(MongoDatabaseFactory mongoDbFactory,
72+
MappingMongoConverter mappingMongoConverter) {
73+
6974
this(mongoDbFactory, mappingMongoConverter, DEFAULT_COLLECTION_NAME);
7075
}
7176

@@ -75,6 +80,7 @@ public MongoDbChannelMessageStore(MongoDatabaseFactory mongoDbFactory, String co
7580

7681
public MongoDbChannelMessageStore(MongoDatabaseFactory mongoDbFactory, MappingMongoConverter mappingMongoConverter,
7782
String collectionName) {
83+
7884
super(mongoDbFactory, mappingMongoConverter, collectionName);
7985
}
8086

@@ -90,7 +96,8 @@ public boolean isPriorityEnabled() {
9096
@Override
9197
public void afterPropertiesSet() {
9298
super.afterPropertiesSet();
93-
getMongoTemplate().indexOps(this.collectionName)
99+
getMongoTemplate()
100+
.indexOps(this.collectionName)
94101
.ensureIndex(new Index(MessageDocumentFields.GROUP_ID, Sort.Direction.ASC)
95102
.on(MessageDocumentFields.PRIORITY, Sort.Direction.DESC)
96103
.on(MessageDocumentFields.LAST_MODIFIED_TIME, Sort.Direction.ASC)
@@ -109,10 +116,10 @@ public MessageGroup addMessageToGroup(Object groupId, Message<?> message) {
109116
if (this.priorityEnabled) {
110117
document.setPriority(message.getHeaders().get(IntegrationMessageHeaderAccessor.PRIORITY, Integer.class));
111118
}
112-
document.setSequence(this.getNextId());
119+
document.setSequence(getNextId());
113120

114-
this.addMessageDocument(document);
115-
return this.getMessageGroup(groupId);
121+
addMessageDocument(document);
122+
return getMessageGroup(groupId);
116123
}
117124

118125
/**

spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -470,14 +470,15 @@ private void updateGroup(Object groupId, Update update) {
470470
this.template.findAndModify(query, update, FindAndModifyOptions.none(), Map.class, this.collectionName);
471471
}
472472

473-
private int getNextId() {
473+
private long getNextId() {
474474
Query query = Query.query(Criteria.where("_id").is(SEQUENCE_NAME));
475475
query.fields().include(SEQUENCE);
476-
return (Integer) this.template.findAndModify(query,
477-
new Update().inc(SEQUENCE, 1),
476+
return ((Number) this.template.findAndModify(query,
477+
new Update().inc(SEQUENCE, 1L),
478478
FindAndModifyOptions.options().returnNew(true).upsert(true),
479-
Map.class,
480-
this.collectionName).get(SEQUENCE); // NOSONAR - never returns null
479+
Map.class, this.collectionName)
480+
.get(SEQUENCE)) // NOSONAR - never returns null
481+
.longValue();
481482
}
482483

483484
@SuppressWarnings(UNCHECKED)
@@ -848,7 +849,7 @@ private static final class MessageWrapper {
848849
private volatile boolean _group_complete; // NOSONAR name
849850

850851
@SuppressWarnings(UNUSED)
851-
private int sequence;
852+
private long sequence;
852853

853854
MessageWrapper(Message<?> message) {
854855
Assert.notNull(message, "'message' must not be null");
@@ -917,7 +918,7 @@ public void set_Group_complete(boolean completedGroup) { // NOSONAR name
917918
this._group_complete = completedGroup;
918919
}
919920

920-
public void set_Sequence(int sequence) { // NOSONAR name
921+
public void set_Sequence(long sequence) { // NOSONAR name
921922
this.sequence = sequence;
922923
}
923924

0 commit comments

Comments
 (0)