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:
Oleg Zhurakousky
2011-11-21 04:54:13 -05:00
committed by Mark Fisher
parent d67736021a
commit 50d8caa1c3
10 changed files with 237 additions and 68 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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);