INT-2231
Fixed JdbcMessageStore to reuse CREATED_DATE while updating UPDATED_DATE Added support for configuring MessageGroup timeout based on the idle time of the MessageGroup Changed updatedTimestamp to lastModified Added an assertion to AbsractMessageGroup.expireMessageGroups to check if lastModified is 0 Changed attribute name in MessageWrapper in Mongo Message Store
This commit is contained in:
committed by
Mark Fisher
parent
d67736021a
commit
50d8caa1c3
@@ -109,14 +109,14 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS
|
||||
|
||||
// build raw MessageGroup and add enriched Message to it
|
||||
SimpleMessageGroup rawGroup = this.buildMessageGroup(groupId, true);
|
||||
|
||||
rawGroup.setLastModified(System.currentTimeMillis());
|
||||
rawGroup.add(enrichedMessage);
|
||||
|
||||
// store MessageGroupMetadata built from enriched MG
|
||||
this.doStore(MESSAGE_GROUP_KEY_PREFIX + groupId, new MessageGroupMetadata(rawGroup));
|
||||
|
||||
// return clean MG
|
||||
return messageGroup;
|
||||
return this.getMessageGroup(groupId);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -250,6 +250,7 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS
|
||||
|
||||
SimpleMessageGroup messageGroup = new SimpleMessageGroup(messages,
|
||||
groupId, messageGroupMetadata.getTimestamp(), messageGroupMetadata.isComplete());
|
||||
messageGroup.setLastModified(messageGroupMetadata.getLastModified());
|
||||
messageGroup.setLastReleasedMessageSequenceNumber(messageGroupMetadata.getLastReleasedMessageSequenceNumber());
|
||||
return messageGroup;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ public abstract class AbstractMessageGroupStore implements MessageGroupStore, It
|
||||
protected final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
private Collection<MessageGroupCallback> expiryCallbacks = new LinkedHashSet<MessageGroupCallback>();
|
||||
|
||||
private volatile boolean timeoutOnIdle;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -51,6 +53,20 @@ public abstract class AbstractMessageGroupStore implements MessageGroupStore, It
|
||||
registerMessageGroupExpiryCallback(callback);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isTimeoutOnIdle() {
|
||||
return timeoutOnIdle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows you to override the rule for the timeout calculation. Typical timeout is based from the time
|
||||
* the {@link MessageGroup} was created. If you want the timeout to be based on the time
|
||||
* the {@link MessageGroup} was idling (e.g., inactive from the last update) invoke this method with 'true'.
|
||||
* Default is 'false'.
|
||||
*/
|
||||
public void setTimeoutOnIdle(boolean timeoutOnIdle) {
|
||||
this.timeoutOnIdle = timeoutOnIdle;
|
||||
}
|
||||
|
||||
public void registerMessageGroupExpiryCallback(MessageGroupCallback callback) {
|
||||
expiryCallbacks.add(callback);
|
||||
@@ -60,7 +76,13 @@ public abstract class AbstractMessageGroupStore implements MessageGroupStore, It
|
||||
int count = 0;
|
||||
long threshold = System.currentTimeMillis() - timeout;
|
||||
for (MessageGroup group : this) {
|
||||
if (group.getTimestamp() <= threshold) {
|
||||
|
||||
long timestamp = group.getTimestamp();
|
||||
if (this.isTimeoutOnIdle() && group.getLastModified() > 0) {
|
||||
timestamp = group.getLastModified();
|
||||
}
|
||||
|
||||
if (timestamp <= threshold) {
|
||||
count++;
|
||||
expire(group);
|
||||
}
|
||||
|
||||
@@ -80,5 +80,10 @@ public interface MessageGroup {
|
||||
* @return the timestamp (milliseconds since epoch) associated with the creation of this group
|
||||
*/
|
||||
long getTimestamp();
|
||||
|
||||
/**
|
||||
* @return the timestamp (milliseconds since epoch) associated with the time this group was last updated
|
||||
*/
|
||||
long getLastModified();
|
||||
|
||||
}
|
||||
|
||||
@@ -44,6 +44,8 @@ public class MessageGroupMetadata implements Serializable{
|
||||
private final boolean complete;
|
||||
|
||||
private final long timestamp;
|
||||
|
||||
private volatile long lastModified;
|
||||
|
||||
private final int lastReleasedMessageSequenceNumber;
|
||||
|
||||
@@ -61,6 +63,7 @@ public class MessageGroupMetadata implements Serializable{
|
||||
this.complete = messageGroup.isComplete();
|
||||
this.timestamp = messageGroup.getTimestamp();
|
||||
this.lastReleasedMessageSequenceNumber = messageGroup.getLastReleasedMessageSequenceNumber();
|
||||
this.lastModified = messageGroup.getLastModified();
|
||||
}
|
||||
|
||||
public void remove(UUID messageId){
|
||||
@@ -93,6 +96,10 @@ public class MessageGroupMetadata implements Serializable{
|
||||
public boolean isComplete() {
|
||||
return this.complete;
|
||||
}
|
||||
|
||||
public long getLastModified() {
|
||||
return lastModified;
|
||||
}
|
||||
|
||||
public long getTimestamp() {
|
||||
return this.timestamp;
|
||||
|
||||
@@ -39,6 +39,8 @@ public class SimpleMessageGroup implements MessageGroup {
|
||||
|
||||
private final long timestamp;
|
||||
|
||||
private volatile long lastModified;
|
||||
|
||||
private volatile boolean complete;
|
||||
|
||||
public SimpleMessageGroup(Object groupId) {
|
||||
@@ -65,6 +67,14 @@ public class SimpleMessageGroup implements MessageGroup {
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
public void setLastModified(long lastModified){
|
||||
this.lastModified = lastModified;
|
||||
}
|
||||
|
||||
public long getLastModified() {
|
||||
return lastModified;
|
||||
}
|
||||
|
||||
public boolean canAdd(Message<?> message) {
|
||||
return !isMember(message);
|
||||
|
||||
Reference in New Issue
Block a user