diff --git a/spring-integration-core/src/main/java/org/springframework/integration/IntegrationContextRefreshListener.java b/spring-integration-core/src/main/java/org/springframework/integration/IntegrationContextRefreshListener.java index 7bd57df839..14fc1a9778 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/IntegrationContextRefreshListener.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/IntegrationContextRefreshListener.java @@ -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, 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, 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, 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(); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/core/MessageIdGenerationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/core/MessageIdGenerationTests.java index dd046f1a6b..c91448409a 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/core/MessageIdGenerationTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/core/MessageIdGenerationTests.java @@ -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(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());