Improve IdGenerator tests
When one of the IdGenerator tests fails, it affect the rest because the ctx is not closed and therefore headers field for IdGenerator is not reset
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -17,12 +17,12 @@
|
||||
package org.springframework.integration.config;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.fail;
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||
@@ -35,6 +35,8 @@ import org.springframework.util.IdGenerator;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
* @author Artem Bilan
|
||||
*
|
||||
* @since 3.0
|
||||
*
|
||||
*/
|
||||
@@ -42,163 +44,170 @@ public class IdGeneratorConfigurerTests {
|
||||
|
||||
@Test
|
||||
public void testOneBean() {
|
||||
try (GenericApplicationContext context = new GenericApplicationContext()) {
|
||||
context.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
UUID id = headers.getId();
|
||||
assertThat(id.getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(id.getLeastSignificantBits()).isEqualTo(2);
|
||||
}
|
||||
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
UUID id = headers.getId();
|
||||
assertThat(id.getMostSignificantBits()).isNotEqualTo(1);
|
||||
assertThat(id.getLeastSignificantBits()).isNotEqualTo(2);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoBeans() {
|
||||
try (GenericApplicationContext context = new GenericApplicationContext()) {
|
||||
context.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(JdkIdGenerator.class));
|
||||
context.registerBeanDefinition("bar", new RootBeanDefinition(SimpleIncrementingIdGenerator.class));
|
||||
context.refresh();
|
||||
|
||||
// multiple beans are ignored with warning
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoBeans() {
|
||||
try (GenericApplicationContext context = new GenericApplicationContext()) {
|
||||
context.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.refresh();
|
||||
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoContextsSameClass() {
|
||||
try (GenericApplicationContext context = new GenericApplicationContext();
|
||||
GenericApplicationContext context2 = new GenericApplicationContext()) {
|
||||
|
||||
context.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
UUID id = headers.getId();
|
||||
assertThat(id.getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(id.getLeastSignificantBits()).isEqualTo(2);
|
||||
|
||||
context2.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context2.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context2.refresh();
|
||||
}
|
||||
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
UUID id = headers.getId();
|
||||
assertThat(id.getMostSignificantBits()).isNotEqualTo(1);
|
||||
assertThat(id.getLeastSignificantBits()).isNotEqualTo(2);
|
||||
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoContextsSameClassFirstDestroyed() {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
context.close();
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isNotEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isNotEqualTo(2);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoBeans() throws Exception {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(JdkIdGenerator.class));
|
||||
context.registerBeanDefinition("bar", new RootBeanDefinition(SimpleIncrementingIdGenerator.class));
|
||||
context.refresh();
|
||||
|
||||
// multiple beans are ignored with warning
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoBeans() throws Exception {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.refresh();
|
||||
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoContextsSameClass() throws Exception {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
UUID id = headers.getId();
|
||||
assertThat(id.getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(id.getLeastSignificantBits()).isEqualTo(2);
|
||||
|
||||
GenericApplicationContext context2 = new GenericApplicationContext();
|
||||
context2.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context2.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context2.refresh();
|
||||
|
||||
context.close();
|
||||
context2.close();
|
||||
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isNotEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isNotEqualTo(2);
|
||||
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoContextsSameClassFirstDestroyed() throws Exception {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
|
||||
GenericApplicationContext context2 = new GenericApplicationContext();
|
||||
context2.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context2.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context2.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context2.refresh();
|
||||
|
||||
context.close();
|
||||
// we should still use the custom strategy
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
id = headers.getId();
|
||||
assertThat(id.getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(id.getLeastSignificantBits()).isEqualTo(2);
|
||||
|
||||
context2.close();
|
||||
// back to default
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isNotEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isNotEqualTo(2);
|
||||
id = headers.getId();
|
||||
assertThat(id.getMostSignificantBits()).isNotEqualTo(1);
|
||||
assertThat(id.getLeastSignificantBits()).isNotEqualTo(2);
|
||||
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoContextDifferentClass() {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
try (GenericApplicationContext context = new GenericApplicationContext();
|
||||
GenericApplicationContext context2 = new GenericApplicationContext()) {
|
||||
|
||||
GenericApplicationContext context2 = new GenericApplicationContext();
|
||||
context2.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context2.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator2.class));
|
||||
try {
|
||||
context2.refresh();
|
||||
fail("Expected exception");
|
||||
}
|
||||
catch (BeanDefinitionStoreException e) {
|
||||
assertThat(e.getMessage())
|
||||
.isEqualTo("'MessageHeaders.idGenerator' has already been set and can not be set again");
|
||||
}
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
|
||||
context.close();
|
||||
context2.close();
|
||||
context2.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context2.registerBeanDefinition("foo", new RootBeanDefinition(MyIdGenerator2.class));
|
||||
|
||||
assertThatExceptionOfType(BeanDefinitionStoreException.class)
|
||||
.isThrownBy(context2::refresh)
|
||||
.withMessage("'MessageHeaders.idGenerator' has already been set and can not be set again");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJdk() {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(JdkIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isSameAs(context.getBean(IdGenerator.class));
|
||||
|
||||
context.close();
|
||||
try (GenericApplicationContext context = new GenericApplicationContext()) {
|
||||
context.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(JdkIdGenerator.class));
|
||||
context.refresh();
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(TestUtils.getPropertyValue(headers, "idGenerator")).isSameAs(context.getBean(IdGenerator.class));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncrementing() {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
context.registerBeanDefinition("bfpp", new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(SimpleIncrementingIdGenerator.class));
|
||||
context.refresh();
|
||||
IdGenerator idGenerator = context.getBean(IdGenerator.class);
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(0);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(1);
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(0);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
AtomicLong bottomBits = TestUtils.getPropertyValue(idGenerator, "bottomBits", AtomicLong.class);
|
||||
bottomBits.set(0xffffffff);
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(0);
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(1);
|
||||
|
||||
context.close();
|
||||
try (GenericApplicationContext context = new GenericApplicationContext()) {
|
||||
context.registerBeanDefinition("bfpp",
|
||||
new RootBeanDefinition(DefaultConfiguringBeanFactoryPostProcessor.class));
|
||||
context.registerBeanDefinition("foo", new RootBeanDefinition(SimpleIncrementingIdGenerator.class));
|
||||
context.refresh();
|
||||
IdGenerator idGenerator = context.getBean(IdGenerator.class);
|
||||
MessageHeaders headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(0);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(1);
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(0);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(2);
|
||||
AtomicLong bottomBits = TestUtils.getPropertyValue(idGenerator, "bottomBits", AtomicLong.class);
|
||||
bottomBits.set(0xffffffff);
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(0);
|
||||
headers = new MessageHeaders(null);
|
||||
assertThat(headers.getId().getMostSignificantBits()).isEqualTo(1);
|
||||
assertThat(headers.getId().getLeastSignificantBits()).isEqualTo(1);
|
||||
}
|
||||
}
|
||||
|
||||
public static class MyIdGenerator implements IdGenerator {
|
||||
@@ -207,7 +216,8 @@ public class IdGeneratorConfigurerTests {
|
||||
public UUID generateId() {
|
||||
return new UUID(1, 2);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
public static class MyIdGenerator2 implements IdGenerator {
|
||||
|
||||
@@ -215,5 +225,7 @@ public class IdGeneratorConfigurerTests {
|
||||
public UUID generateId() {
|
||||
return new UUID(3, 4);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -13,6 +13,6 @@
|
||||
|
||||
<int:service-activator input-channel="nextB" output-channel="nextC" expression="'nextC'"/>
|
||||
|
||||
<int:logging-channel-adapter id="nextC" level="WARN" log-full-message="true"/>
|
||||
<int:logging-channel-adapter id="nextC" level="DEBUG" log-full-message="true"/>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -25,12 +25,13 @@ import java.util.UUID;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.springframework.context.support.GenericXmlApplicationContext;
|
||||
import org.springframework.integration.test.util.TestUtils;
|
||||
import org.springframework.messaging.MessageChannel;
|
||||
import org.springframework.messaging.MessageHeaders;
|
||||
import org.springframework.messaging.support.GenericMessage;
|
||||
@@ -42,150 +43,107 @@ import org.springframework.util.StopWatch;
|
||||
* @author Oleg Zhurakousky
|
||||
* @author Gunnar Hillert
|
||||
* @author Gary Russell
|
||||
* @author Artem Bilan
|
||||
*/
|
||||
public class MessageIdGenerationTests {
|
||||
|
||||
private final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
@Test
|
||||
public void testCustomIdGenerationWithParentRegistrar() throws Exception {
|
||||
ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("MessageIdGenerationTests-context-withGenerator.xml", this.getClass());
|
||||
ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext(new String[]{"MessageIdGenerationTests-context.xml"}, this.getClass(), parent);
|
||||
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<Integer>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
child.close();
|
||||
parent.close();
|
||||
this.assertDestroy();
|
||||
public void testCustomIdGenerationWithParentRegistrar() {
|
||||
try (ClassPathXmlApplicationContext parent =
|
||||
new ClassPathXmlApplicationContext("MessageIdGenerationTests-context-withGenerator.xml", getClass());
|
||||
ClassPathXmlApplicationContext child =
|
||||
new ClassPathXmlApplicationContext(new String[]{ "MessageIdGenerationTests-context.xml" },
|
||||
getClass(), parent)) {
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
}
|
||||
assertDestroy();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomIdGenerationWithParentChildIndependentCreation() throws Exception {
|
||||
ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("MessageIdGenerationTests-context-withGenerator.xml", this.getClass());
|
||||
GenericXmlApplicationContext child = new GenericXmlApplicationContext();
|
||||
child.load("classpath:/org/springframework/integration/core/MessageIdGenerationTests-context.xml");
|
||||
child.setParent(parent);
|
||||
child.refresh();
|
||||
public void testCustomIdGenerationWithParentChildIndependentCreation() {
|
||||
try (ClassPathXmlApplicationContext parent =
|
||||
new ClassPathXmlApplicationContext("MessageIdGenerationTests-context-withGenerator.xml", getClass());
|
||||
GenericXmlApplicationContext child = new GenericXmlApplicationContext()) {
|
||||
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<Integer>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
child.close();
|
||||
parent.close();
|
||||
this.assertDestroy();
|
||||
child.load("classpath:/org/springframework/integration/core/MessageIdGenerationTests-context.xml");
|
||||
child.setParent(parent);
|
||||
child.refresh();
|
||||
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
}
|
||||
assertDestroy();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomIdGenerationWithParentRegistrarClosed() throws Exception {
|
||||
ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("MessageIdGenerationTests-context-withGenerator.xml", this.getClass());
|
||||
ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext(new String[]{"MessageIdGenerationTests-context.xml"}, this.getClass(), parent);
|
||||
public void testCustomIdGenerationWithChildRegistrar() {
|
||||
try (ClassPathXmlApplicationContext parent =
|
||||
new ClassPathXmlApplicationContext("MessageIdGenerationTests-context.xml", getClass());
|
||||
ClassPathXmlApplicationContext child =
|
||||
new ClassPathXmlApplicationContext(
|
||||
new String[]{ "MessageIdGenerationTests-context-withGenerator.xml" },
|
||||
getClass(), parent)) {
|
||||
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<Integer>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
parent.close();
|
||||
child.close();
|
||||
this.assertDestroy();
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
Mockito.reset(idGenerator);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
}
|
||||
assertDestroy();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomIdGenerationWithChildRegistrar() throws Exception {
|
||||
ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("MessageIdGenerationTests-context.xml", this.getClass());
|
||||
ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext(new String[]{"MessageIdGenerationTests-context-withGenerator.xml"}, this.getClass(), parent);
|
||||
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
Mockito.reset(idGenerator);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<Integer>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
child.close();
|
||||
parent.close();
|
||||
this.assertDestroy();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomIdGenerationWithChildRegistrarClosed() throws Exception {
|
||||
ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("MessageIdGenerationTests-context.xml", this.getClass());
|
||||
ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext(new String[]{"MessageIdGenerationTests-context-withGenerator.xml"}, this.getClass(), parent);
|
||||
|
||||
IdGenerator idGenerator = child.getBean("idGenerator", IdGenerator.class);
|
||||
Mockito.reset(idGenerator);
|
||||
MessageChannel inputChannel = child.getBean("input", MessageChannel.class);
|
||||
inputChannel.send(new GenericMessage<Integer>(0));
|
||||
verify(idGenerator, atLeastOnce()).generateId();
|
||||
child.close();
|
||||
parent.close();
|
||||
this.assertDestroy();
|
||||
}
|
||||
|
||||
// similar to the last test, but should not fail because child AC is closed before second child AC is started
|
||||
@Test
|
||||
public void testCustomIdGenerationWithParentChildIndependentCreationChildrenRegistrarsOneAtTheTime() throws Exception {
|
||||
ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("MessageIdGenerationTests-context.xml", this.getClass());
|
||||
|
||||
GenericXmlApplicationContext childA = new GenericXmlApplicationContext();
|
||||
childA.load("classpath:/org/springframework/integration/core/MessageIdGenerationTests-context-withGenerator.xml");
|
||||
childA.setParent(parent);
|
||||
childA.refresh();
|
||||
|
||||
childA.close();
|
||||
|
||||
GenericXmlApplicationContext childB = new GenericXmlApplicationContext();
|
||||
childB.load("classpath:/org/springframework/integration/core/MessageIdGenerationTests-context-withGenerator.xml");
|
||||
childB.setParent(parent);
|
||||
childB.refresh();
|
||||
|
||||
parent.close();
|
||||
childB.close();
|
||||
this.assertDestroy();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
@Disabled
|
||||
public void performanceTest() {
|
||||
int times = 1000000;
|
||||
StopWatch watch = new StopWatch();
|
||||
watch.start();
|
||||
for (int i = 0; i < times; i++) {
|
||||
new GenericMessage<Integer>(0);
|
||||
new GenericMessage<>(0);
|
||||
}
|
||||
watch.stop();
|
||||
double defaultGeneratorElapsedTime = watch.getTotalTimeSeconds();
|
||||
|
||||
Field idGeneratorField = ReflectionUtils.findField(MessageHeaders.class, "idGenerator");
|
||||
ReflectionUtils.makeAccessible(idGeneratorField);
|
||||
ReflectionUtils.setField(idGeneratorField, null, (IdGenerator) () -> TimeBasedUUIDGenerator.generateId());
|
||||
ReflectionUtils.setField(idGeneratorField, null, (IdGenerator) TimeBasedUUIDGenerator::generateId);
|
||||
watch = new StopWatch();
|
||||
watch.start();
|
||||
for (int i = 0; i < times; i++) {
|
||||
new GenericMessage<Integer>(0);
|
||||
new GenericMessage<>(0);
|
||||
}
|
||||
watch.stop();
|
||||
double timebasedGeneratorElapsedTime = watch.getTotalTimeSeconds();
|
||||
double timeBasedGeneratorElapsedTime = watch.getTotalTimeSeconds();
|
||||
|
||||
logger.info("Generated " + times + " messages using default UUID generator " +
|
||||
"in " + defaultGeneratorElapsedTime + " seconds");
|
||||
logger.info("Generated " + times + " messages using Timebased UUID generator " +
|
||||
"in " + timebasedGeneratorElapsedTime + " seconds");
|
||||
logger.info("Generated " + times + " messages using time-based UUID generator " +
|
||||
"in " + timeBasedGeneratorElapsedTime + " seconds");
|
||||
|
||||
logger.info("Time-based ID generator is " + defaultGeneratorElapsedTime / timebasedGeneratorElapsedTime + " times faster");
|
||||
logger.info("Time-based ID generator is " + defaultGeneratorElapsedTime / timeBasedGeneratorElapsedTime +
|
||||
" times faster");
|
||||
}
|
||||
|
||||
private void assertDestroy() throws Exception {
|
||||
Field idGenField = ReflectionUtils.findField(MessageHeaders.class, "idGenerator");
|
||||
ReflectionUtils.makeAccessible(idGenField);
|
||||
assertThat(idGenField.get(null)).as("the idGenerator field has not been properly reset to null").isNull();
|
||||
private void assertDestroy() {
|
||||
assertThat(TestUtils.getPropertyValue(new MessageHeaders(null), "idGenerator")).isNull();
|
||||
}
|
||||
|
||||
|
||||
public static class SampleIdGenerator implements IdGenerator {
|
||||
|
||||
@Override
|
||||
public UUID generateId() {
|
||||
return UUID.nameUUIDFromBytes(((System.currentTimeMillis() - System.nanoTime()) + "").getBytes());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user