INT-1903 polishing
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user