INT-1903 polishing

This commit is contained in:
Oleg Zhurakousky
2011-05-14 12:10:55 -04:00
parent 636a90a08f
commit 3e44b500fb
3 changed files with 34 additions and 44 deletions

View File

@@ -22,7 +22,7 @@ import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.integration.MessageHeaders.MessageIdGenerationStrategy;
import org.springframework.integration.MessageHeaders.IdGenerator;
/**
@@ -34,9 +34,21 @@ public class IntegrationContextRefreshListener implements ApplicationListener<Co
private final Log logger = LogFactory.getLog(getClass());
public void onApplicationEvent(ContextRefreshedEvent event) {
this.setIdGenerationStrategy(event);
}
public void destroy() throws Exception {
this.resetIdGenerationStrategy();
}
private void resetIdGenerationStrategy(){
MessageHeaders.resetIdGenerator();
}
private void setIdGenerationStrategy(ContextRefreshedEvent event){
try {
MessageIdGenerationStrategy idGenerationStrategy =
event.getApplicationContext().getBean(MessageIdGenerationStrategy.class);
IdGenerator idGenerationStrategy =
event.getApplicationContext().getBean(IdGenerator.class);
if (logger.isDebugEnabled()) {
logger.debug("Using MessageHeaders.MessageIdGenerationStrategy [" + idGenerationStrategy + "]");
}
@@ -50,8 +62,4 @@ public class IntegrationContextRefreshListener implements ApplicationListener<Co
}
}
public void destroy() throws Exception {
MessageHeaders.reset();
}
}

View File

@@ -28,8 +28,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -62,13 +60,7 @@ public final class MessageHeaders implements Map<String, Object>, Serializable {
private static final Log logger = LogFactory.getLog(MessageHeaders.class);
private static MessageIdGenerationStrategy messageIdGenerationStrategy = new DefaultIdGenerator();
private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private static final WriteLock writeLock = rwl.writeLock();
private static boolean idGenerationStrategySet;
private static IdGenerator messageIdGenerator = new DefaultIdGenerator();
/**
* The key for the Message ID. This is an automatically generated UUID and
@@ -109,35 +101,25 @@ public final class MessageHeaders implements Map<String, Object>, Serializable {
* (that is when the setMessageIdGenerationStrategy(..) is called and for reset() all the adapters
* will be shut down by the time reset() is called.
*/
this.headers.put(ID, MessageHeaders.messageIdGenerationStrategy.generateId());
this.headers.put(ID, MessageHeaders.messageIdGenerator.generateId());
this.headers.put(TIMESTAMP, new Long(System.currentTimeMillis()));
}
public static void setMessageIdGenerationStrategy(MessageIdGenerationStrategy messageIdGenerationStrategy) {
writeLock.lock();
try {
Assert.state(!MessageHeaders.idGenerationStrategySet, "'MessageHeaders.messageIdGenerationStrategy' " +
"has already been set and can not be set again, unless reset() method is called");
public static void setMessageIdGenerationStrategy(IdGenerator messageIdGenerationStrategy) {
Assert.state(MessageHeaders.messageIdGenerator instanceof DefaultIdGenerator, "'MessageHeaders.messageIdGenerationStrategy' " +
"has already been set and can not be set again, unless reset() method is called");
if (logger.isInfoEnabled()){
logger.info("Message IDs will be generated using custom ID generation strategy: " + messageIdGenerationStrategy);
MessageHeaders.messageIdGenerationStrategy = messageIdGenerationStrategy;
MessageHeaders.idGenerationStrategySet = true;
}
finally {
writeLock.unlock();
}
}
MessageHeaders.messageIdGenerator = messageIdGenerationStrategy;
}
public static void reset(){
writeLock.lock();
try {
MessageHeaders.idGenerationStrategySet = false;
MessageHeaders.messageIdGenerationStrategy = new DefaultIdGenerator();
}
finally {
writeLock.unlock();
public static void resetIdGenerator(){
MessageHeaders.messageIdGenerator = new DefaultIdGenerator();
if (logger.isInfoEnabled()){
logger.info("Message IDs generation strategy was reset to the default");
}
logger.info("Message IDs genration strategy was reset to the default");
}
public UUID getId() {
@@ -298,12 +280,12 @@ public final class MessageHeaders implements Map<String, Object>, Serializable {
in.defaultReadObject();
}
public static interface MessageIdGenerationStrategy {
public static interface IdGenerator {
UUID generateId();
}
private static class DefaultIdGenerator implements MessageIdGenerationStrategy {
private static class DefaultIdGenerator implements IdGenerator {
public UUID generateId() {
return UUID.randomUUID();

View File

@@ -27,7 +27,7 @@ import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.MessageChannel;
import org.springframework.integration.MessageHeaders;
import org.springframework.integration.MessageHeaders.MessageIdGenerationStrategy;
import org.springframework.integration.MessageHeaders.IdGenerator;
import org.springframework.integration.message.GenericMessage;
import org.springframework.util.StopWatch;
@@ -40,7 +40,7 @@ public class MessageIdGenerationTests {
@Test
public void testCustomIdGeneration(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("MessageIdGenerationTests-context.xml", this.getClass());
MessageIdGenerationStrategy idGenerator = context.getBean("idGenerator", MessageIdGenerationStrategy.class);
IdGenerator idGenerator = context.getBean("idGenerator", IdGenerator.class);
MessageChannel inputChannel = context.getBean("input", MessageChannel.class);
inputChannel.send(new GenericMessage<Integer>(0));
verify(idGenerator, times(4)).generateId();
@@ -62,7 +62,7 @@ public class MessageIdGenerationTests {
watch.stop();
double defaultGeneratorElapsedTime = watch.getTotalTimeSeconds();
MessageHeaders.setMessageIdGenerationStrategy(new MessageIdGenerationStrategy() {
MessageHeaders.setMessageIdGenerationStrategy(new IdGenerator() {
public UUID generateId() {
return TimeBasedUUIDGenerator.generateId();
}
@@ -80,13 +80,13 @@ public class MessageIdGenerationTests {
System.out.println("Generated " + times + " messages using Timebased UUID generator " +
"in " + timebasedGeneratorElapsedTime + " seconds");
System.out.println(defaultGeneratorElapsedTime/timebasedGeneratorElapsedTime);
System.out.println("Time-based ID generator is " + defaultGeneratorElapsedTime/timebasedGeneratorElapsedTime + " times faster");
}
public static class SampleIdGenerator implements MessageIdGenerationStrategy {
public static class SampleIdGenerator implements IdGenerator {
public UUID generateId() {
return UUID.nameUUIDFromBytes(((System.currentTimeMillis() - System.nanoTime()) + "").getBytes());