Make Actuator optional

This commit is contained in:
Dave Syer
2018-02-23 14:58:16 +00:00
committed by Oleg Zhurakousky
parent 8ba93c2c79
commit bf69f467e3
5 changed files with 172 additions and 132 deletions

2
.gitignore vendored
View File

@@ -12,6 +12,8 @@ _site/
.project
.settings
.springBeans
.sts4-cache/
.attach_pid*
.DS_Store
*.sw*
*.iml

View File

@@ -17,6 +17,7 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@@ -60,8 +60,8 @@ import org.springframework.util.StringUtils;
* @author Oleg Zhurakousky
*/
@EnableBinding
public class AggregateApplicationBuilder implements AggregateApplication, ApplicationContextAware,
SmartInitializingSingleton {
public class AggregateApplicationBuilder implements AggregateApplication,
ApplicationContextAware, SmartInitializingSingleton {
private static final String CHILD_CONTEXT_SUFFIX = ".spring.cloud.stream.context";
@@ -106,6 +106,11 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
private void addParentSources(Object[] sources) {
if (!this.parentSources.contains(ParentConfiguration.class)) {
this.parentSources.add(ParentConfiguration.class);
if (ClassUtils.isPresent(
"org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration",
null)) {
this.parentSources.add(ParentActuatorConfiguration.class);
}
}
this.parentSources.addAll(Arrays.asList(sources));
}
@@ -150,23 +155,25 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.parentContext = (ConfigurableApplicationContext) applicationContext;
}
@Override
public <T> T getBinding(Class<T> bindableType, String namespace) {
if (parentContext == null) {
throw new IllegalStateException("The aggregate application has not been started yet");
throw new IllegalStateException(
"The aggregate application has not been started yet");
}
try {
ChildContextHolder contextHolder = parentContext.getBean(namespace + CHILD_CONTEXT_SUFFIX,
ChildContextHolder.class);
ChildContextHolder contextHolder = parentContext
.getBean(namespace + CHILD_CONTEXT_SUFFIX, ChildContextHolder.class);
return contextHolder.getChildContext().getBean(bindableType);
}
catch (BeansException e) {
throw new IllegalStateException("Binding not found for '" + bindableType.getName() + "' into namespace " +
namespace);
throw new IllegalStateException("Binding not found for '"
+ bindableType.getName() + "' into namespace " + namespace);
}
}
@@ -200,35 +207,41 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
// to remove illegal characters for new properties
// binder
// org.springframework.cloud.stream.aggregation.AggregationTest$TestSource
appConfigurer.namespace = AggregateApplicationUtils
.getDefaultNamespace(appConfigurer.getApp().getName().replaceAll("\\$", "."), i);
appConfigurer.namespace = AggregateApplicationUtils.getDefaultNamespace(
appConfigurer.getApp().getName().replaceAll("\\$", "."), i);
}
appsToEmbed.put(appToEmbed, appConfigurer.namespace);
appConfigurers.put(appConfigurer, appConfigurer.namespace);
}
if (this.parentContext == null) {
if (Boolean.TRUE.equals(this.webEnvironment)) {
Assert.isTrue(ClassUtils.isPresent("javax.servlet.ServletRequest", ClassUtils.getDefaultClassLoader()),
Assert.isTrue(
ClassUtils.isPresent("javax.servlet.ServletRequest",
ClassUtils.getDefaultClassLoader()),
"'webEnvironment' is set to 'true' but 'javax.servlet.*' does not appear to be available in "
+ "the classpath. Consider adding `org.springframework.boot:spring-boot-starter-web");
this.addParentSources(new Object[] { ServletWebServerFactoryAutoConfiguration.class });
+ "the classpath. Consider adding `org.springframework.boot:spring-boot-starter-web");
this.addParentSources(
new Object[] { ServletWebServerFactoryAutoConfiguration.class });
}
this.parentContext = AggregateApplicationUtils.createParentContext(
this.parentSources.toArray(new Class<?>[0]),
this.parentArgs.toArray(new String[0]), selfContained(), this.webEnvironment, this.headless);
this.parentArgs.toArray(new String[0]), selfContained(),
this.webEnvironment, this.headless);
}
else {
if (BeanFactoryUtils.beansOfTypeIncludingAncestors(this.parentContext, SharedBindingTargetRegistry.class)
.size() == 0) {
if (BeanFactoryUtils.beansOfTypeIncludingAncestors(this.parentContext,
SharedBindingTargetRegistry.class).size() == 0) {
SharedBindingTargetRegistry sharedBindingTargetRegistry = new SharedBindingTargetRegistry();
this.parentContext.getBeanFactory().registerSingleton("sharedBindingTargetRegistry",
sharedBindingTargetRegistry);
this.parentContext.getBeanFactory().registerSingleton(
"sharedBindingTargetRegistry", sharedBindingTargetRegistry);
}
}
SharedBindingTargetRegistry sharedBindingTargetRegistry = this.parentContext
.getBean(SharedBindingTargetRegistry.class);
AggregateApplicationUtils.prepareSharedBindingTargetRegistry(sharedBindingTargetRegistry, appsToEmbed);
for (Map.Entry<AppConfigurer<?>, String> appConfigurerEntry : appConfigurers.entrySet()) {
AggregateApplicationUtils.prepareSharedBindingTargetRegistry(
sharedBindingTargetRegistry, appsToEmbed);
for (Map.Entry<AppConfigurer<?>, String> appConfigurerEntry : appConfigurers
.entrySet()) {
AppConfigurer<?> appConfigurer = appConfigurerEntry.getKey();
if (appConfigurerEntry.getValue() == null) {
@@ -237,7 +250,8 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
String namespace = appConfigurerEntry.getValue().toLowerCase();
Set<String> argsToUpdate = new LinkedHashSet<>();
Set<String> argKeys = new LinkedHashSet<>();
Map<String, String> target = bindProperties(namespace, this.parentContext.getEnvironment());
Map<String, String> target = bindProperties(namespace,
this.parentContext.getEnvironment());
if (!target.isEmpty()) {
for (Map.Entry<String, String> entry : target.entrySet()) {
@@ -255,9 +269,10 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
AppConfigurer<?> appConfigurer = apps.get(i);
appConfigurer.embed();
}
if (BeanFactoryUtils.beansOfTypeIncludingAncestors(this.parentContext, AggregateApplication.class)
.size() == 0) {
this.parentContext.getBeanFactory().registerSingleton("aggregateApplicationAccessor", this);
if (BeanFactoryUtils.beansOfTypeIncludingAncestors(this.parentContext,
AggregateApplication.class).size() == 0) {
this.parentContext.getBeanFactory()
.registerSingleton("aggregateApplicationAccessor", this);
}
return this.parentContext;
}
@@ -266,14 +281,16 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
return (this.sourceConfigurer != null) && (this.sinkConfigurer != null);
}
private ChildContextBuilder childContext(Class<?> app, ConfigurableApplicationContext parentContext,
String namespace) {
return new ChildContextBuilder(AggregateApplicationUtils.embedApp(parentContext, namespace, app));
private ChildContextBuilder childContext(Class<?> app,
ConfigurableApplicationContext parentContext, String namespace) {
return new ChildContextBuilder(
AggregateApplicationUtils.embedApp(parentContext, namespace, app));
}
private Map<String, String> bindProperties(String namepace, Environment environment) {
Map<String, String> target;
BindResult<Map<String, String>> bindResult = Binder.get(environment).bind(namepace, STRING_STRING_MAP);
BindResult<Map<String, String>> bindResult = Binder.get(environment)
.bind(namepace, STRING_STRING_MAP);
if (bindResult.isBound()) {
target = bindResult.get();
}
@@ -297,7 +314,7 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
}
}
@ImportAutoConfiguration({ ChannelBindingAutoConfiguration.class, EndpointAutoConfiguration.class })
@ImportAutoConfiguration(ChannelBindingAutoConfiguration.class)
@EnableBinding
public static class ParentConfiguration {
@Bean
@@ -307,6 +324,10 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
}
}
@ImportAutoConfiguration(EndpointAutoConfiguration.class)
public static class ParentActuatorConfiguration {
}
public class SourceConfigurer extends AppConfigurer<SourceConfigurer> {
public SourceConfigurer(Class<?> app) {
@@ -397,20 +418,24 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic
void embed() {
final ConfigurableApplicationContext childContext = childContext(this.app,
AggregateApplicationBuilder.this.parentContext, this.namespace).args(this.args).config(this.names)
.profiles(this.profiles).run();
AggregateApplicationBuilder.this.parentContext, this.namespace)
.args(this.args).config(this.names).profiles(this.profiles)
.run();
// Register bindable proxies as beans so they can be queried for later
Map<String, BindableProxyFactory> bindableProxies = BeanFactoryUtils
.beansOfTypeIncludingAncestors(childContext.getBeanFactory(), BindableProxyFactory.class);
.beansOfTypeIncludingAncestors(childContext.getBeanFactory(),
BindableProxyFactory.class);
for (String bindableProxyName : bindableProxies.keySet()) {
try {
AggregateApplicationBuilder.this.parentContext.getBeanFactory().registerSingleton(
this.getNamespace() + CHILD_CONTEXT_SUFFIX, new ChildContextHolder(childContext));
AggregateApplicationBuilder.this.parentContext.getBeanFactory()
.registerSingleton(this.getNamespace() + CHILD_CONTEXT_SUFFIX,
new ChildContextHolder(childContext));
}
catch (Exception e) {
throw new IllegalStateException(
"Error while trying to register the aggregate bound interface '"
+ bindableProxyName + "' into namespace '" + this.getNamespace() + "'",
+ bindableProxyName + "' into namespace '"
+ this.getNamespace() + "'",
e);
}
}

View File

@@ -46,32 +46,41 @@ import org.springframework.context.annotation.Configuration;
@Configuration
@AutoConfigureBefore(SimpleMetricsExportAutoConfiguration.class)
@AutoConfigureAfter(MetricsAutoConfiguration.class)
@ConditionalOnClass(Binder.class)
@ConditionalOnProperty("spring.cloud.stream.bindings." + MetersPublisherBinding.APPLICATION_METRICS + ".destination")
@ConditionalOnClass({ Binder.class, MetricsAutoConfiguration.class })
@ConditionalOnProperty("spring.cloud.stream.bindings."
+ MetersPublisherBinding.APPLICATION_METRICS + ".destination")
@EnableConfigurationProperties(ApplicationMetricsProperties.class)
public class DestinationPublishingMetricsAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MetricsPublisherConfig metricsPublisherConfig(ApplicationMetricsProperties metersPublisherProperties) {
public MetricsPublisherConfig metricsPublisherConfig(
ApplicationMetricsProperties metersPublisherProperties) {
return new MetricsPublisherConfig(metersPublisherProperties);
}
@Bean
@ConditionalOnMissingBean
public DefaultDestinationPublishingMeterRegistry defaultDestinationPublishingMeterRegistry(ApplicationMetricsProperties applicationMetricsProperties,
MetersPublisherBinding publisherBinding, MetricsPublisherConfig metricsPublisherConfig, Clock clock) {
return new DefaultDestinationPublishingMeterRegistry(applicationMetricsProperties, publisherBinding, metricsPublisherConfig, clock);
public DefaultDestinationPublishingMeterRegistry defaultDestinationPublishingMeterRegistry(
ApplicationMetricsProperties applicationMetricsProperties,
MetersPublisherBinding publisherBinding,
MetricsPublisherConfig metricsPublisherConfig, Clock clock) {
return new DefaultDestinationPublishingMeterRegistry(applicationMetricsProperties,
publisherBinding, metricsPublisherConfig, clock);
}
@Bean
public BeanFactoryPostProcessor metersPublisherBindingRegistrant() {
return new BeanFactoryPostProcessor() {
return new BeanFactoryPostProcessor() {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
RootBeanDefinition emitterBindingDefinition = new RootBeanDefinition(BindableProxyFactory.class);
emitterBindingDefinition.getConstructorArgumentValues().addGenericArgumentValue(MetersPublisherBinding.class);
((DefaultListableBeanFactory)beanFactory).registerBeanDefinition(MetersPublisherBinding.class.getName(), emitterBindingDefinition);
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
RootBeanDefinition emitterBindingDefinition = new RootBeanDefinition(
BindableProxyFactory.class);
emitterBindingDefinition.getConstructorArgumentValues()
.addGenericArgumentValue(MetersPublisherBinding.class);
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition(
MetersPublisherBinding.class.getName(), emitterBindingDefinition);
}
};
}

View File

@@ -51,8 +51,6 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* @author Marius Bogoevici
* @author Ilayaperumal Gopinathan
@@ -84,10 +82,7 @@ public class AggregationTest {
public void aggregation() {
aggregatedApplicationContext = new AggregateApplicationBuilder(
MockBinderRegistryConfiguration.class, "--server.port=0", "--debug=true")
.web(false)
.from(TestSource.class)
.to(TestProcessor.class)
.run();
.web(false).from(TestSource.class).to(TestProcessor.class).run();
SharedBindingTargetRegistry sharedBindingTargetRegistry = aggregatedApplicationContext
.getBean(SharedBindingTargetRegistry.class);
BindingTargetFactory channelFactory = aggregatedApplicationContext
@@ -115,7 +110,7 @@ public class AggregationTest {
@Test
@SuppressWarnings("unchecked")
public void testParentArgsAndSources() {
List<String> argsToVerify = new ArrayList<>();
argsToVerify.add("--foo1=bar1");
argsToVerify.add("--foo2=bar2");
@@ -124,15 +119,15 @@ public class AggregationTest {
AggregateApplicationBuilder aggregateApplicationBuilder = new AggregateApplicationBuilder(
MockBinderRegistryConfiguration.class, "--foo1=bar1");
final ConfigurableApplicationContext context = aggregateApplicationBuilder
.parent(DummyConfig.class, "--foo2=bar2")
.web(false)
.from(TestSource.class)
.namespace("foo").to(TestProcessor.class).namespace("bar")
.run("--foo3=bar3", "--server.port=0");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
final List<String> parentArgs = (List<String>) aggregateApplicationBuilderAccessor.getPropertyValue(
"parentArgs");
assertThat(parentArgs).containsExactlyInAnyOrder(argsToVerify.toArray(new String[argsToVerify.size()]));
.parent(DummyConfig.class, "--foo2=bar2").web(false)
.from(TestSource.class).namespace("foo").to(TestProcessor.class)
.namespace("bar").run("--foo3=bar3", "--server.port=0");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
final List<String> parentArgs = (List<String>) aggregateApplicationBuilderAccessor
.getPropertyValue("parentArgs");
assertThat(parentArgs).containsExactlyInAnyOrder(
argsToVerify.toArray(new String[argsToVerify.size()]));
context.close();
}
@@ -143,12 +138,15 @@ public class AggregationTest {
MockBinderRegistryConfiguration.class, "--foo1=bar1");
final ConfigurableApplicationContext context = aggregateApplicationBuilder
.parent(DummyConfig.class, "--foo2=bar2").web(false)
.from(TestSource.class)
.namespace("foo").to(TestProcessor.class).namespace("bar")
.run("--server.port=0");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
List<Object> sources = (List<Object>) aggregateApplicationBuilderAccessor.getPropertyValue("parentSources");
assertThat(sources).containsExactlyInAnyOrder(AggregateApplicationBuilder.ParentConfiguration.class,
.from(TestSource.class).namespace("foo").to(TestProcessor.class)
.namespace("bar").run("--server.port=0");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
List<Object> sources = (List<Object>) aggregateApplicationBuilderAccessor
.getPropertyValue("parentSources");
assertThat(sources).containsExactlyInAnyOrder(
AggregateApplicationBuilder.ParentConfiguration.class,
AggregateApplicationBuilder.ParentActuatorConfiguration.class,
MockBinderRegistryConfiguration.class, DummyConfig.class);
context.close();
}
@@ -158,17 +156,18 @@ public class AggregationTest {
public void testNamespacePrefixesFromCmdLine() {
AggregateApplicationBuilder aggregateApplicationBuilder = new AggregateApplicationBuilder(
MockBinderRegistryConfiguration.class);
aggregatedApplicationContext = aggregateApplicationBuilder.parent(DummyConfig.class).web(false).from(TestSource.class)
aggregatedApplicationContext = aggregateApplicationBuilder
.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").via(TestProcessor.class).namespace("b")
.via(TestProcessor.class).namespace("c")
.run("--a.foo1=bar1", "--b.foo1=bar2", "--c.foo1=bar3");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
assertTrue(Arrays.equals(
((SourceConfigurer) aggregateApplicationBuilderAccessor.getPropertyValue("sourceConfigurer"))
.getArgs(),
((SourceConfigurer) aggregateApplicationBuilderAccessor
.getPropertyValue("sourceConfigurer")).getArgs(),
new String[] { "--foo1=bar1" }));
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers =
(List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers = (List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
.getPropertyValue("processorConfigurers");
for (AggregateApplicationBuilder.ProcessorConfigurer processorConfigurer : processorConfigurers) {
if (processorConfigurer.getNamespace().equals("b")) {
@@ -188,18 +187,18 @@ public class AggregationTest {
public void testNamespacePrefixesFromCmdLineVsArgs() {
AggregateApplicationBuilder aggregateApplicationBuilder = new AggregateApplicationBuilder(
MockBinderRegistryConfiguration.class);
aggregatedApplicationContext = aggregateApplicationBuilder.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--fooValue=bar")
.via(TestProcessor.class).namespace("b").args("--foo1=argbarb")
.via(TestProcessor.class).namespace("c")
.run("--a.fooValue=bara", "--c.foo1=barc");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
aggregatedApplicationContext = aggregateApplicationBuilder
.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--fooValue=bar").via(TestProcessor.class)
.namespace("b").args("--foo1=argbarb").via(TestProcessor.class)
.namespace("c").run("--a.fooValue=bara", "--c.foo1=barc");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
assertTrue(Arrays.equals(
((SourceConfigurer) aggregateApplicationBuilderAccessor.getPropertyValue("sourceConfigurer"))
.getArgs(),
((SourceConfigurer) aggregateApplicationBuilderAccessor
.getPropertyValue("sourceConfigurer")).getArgs(),
new String[] { "--fooValue=bara" }));
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers =
(List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers = (List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
.getPropertyValue("processorConfigurers");
for (AggregateApplicationBuilder.ProcessorConfigurer processorConfigurer : processorConfigurers) {
if (processorConfigurer.getNamespace().equals("b")) {
@@ -219,18 +218,19 @@ public class AggregationTest {
public void testNamespacePrefixesFromCmdLineWithRelaxedNames() {
AggregateApplicationBuilder aggregateApplicationBuilder = new AggregateApplicationBuilder(
MockBinderRegistryConfiguration.class);
aggregatedApplicationContext = aggregateApplicationBuilder.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar")
.via(TestProcessor.class).namespace("b").args("--fooValue=argbarb")
.via(TestProcessor.class).namespace("c")
aggregatedApplicationContext = aggregateApplicationBuilder
.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar").via(TestProcessor.class)
.namespace("b").args("--fooValue=argbarb").via(TestProcessor.class)
.namespace("c")
.run("--a.fooValue=bara", "--b.foo-value=barb", "--c.foo1=barc");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
assertTrue(Arrays.equals(
((SourceConfigurer) aggregateApplicationBuilderAccessor.getPropertyValue("sourceConfigurer"))
.getArgs(),
((SourceConfigurer) aggregateApplicationBuilderAccessor
.getPropertyValue("sourceConfigurer")).getArgs(),
new String[] { "--fooValue=bara" }));
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers =
(List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers = (List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
.getPropertyValue("processorConfigurers");
for (AggregateApplicationBuilder.ProcessorConfigurer processorConfigurer : processorConfigurers) {
if (processorConfigurer.getNamespace().equals("b")) {
@@ -238,7 +238,8 @@ public class AggregationTest {
new String[] { "--foo-value=barb" }));
}
if (processorConfigurer.getNamespace().equals("c")) {
assertThat(processorConfigurer.getArgs(), is(new String[] { "--foo1=barc" }));
assertThat(processorConfigurer.getArgs(),
is(new String[] { "--foo1=barc" }));
}
}
aggregatedApplicationContext.close();
@@ -252,18 +253,18 @@ public class AggregationTest {
System.setProperty("a.foo-value", "sysbara");
System.setProperty("c.fooValue", "sysbarc");
System.setProperty("server.port", "0");
aggregatedApplicationContext = aggregateApplicationBuilder.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar")
.via(TestProcessor.class).namespace("b").args("--fooValue=argbarb")
.via(TestProcessor.class).namespace("c").args("--foo-value=argbarc")
.run("--a.fooValue=bara");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
aggregatedApplicationContext = aggregateApplicationBuilder
.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar").via(TestProcessor.class)
.namespace("b").args("--fooValue=argbarb").via(TestProcessor.class)
.namespace("c").args("--foo-value=argbarc").run("--a.fooValue=bara");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
assertTrue(Arrays.equals(
((SourceConfigurer) aggregateApplicationBuilderAccessor.getPropertyValue("sourceConfigurer"))
.getArgs(),
((SourceConfigurer) aggregateApplicationBuilderAccessor
.getPropertyValue("sourceConfigurer")).getArgs(),
new String[] { "--fooValue=bara", "--foo-value=bara" }));
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers =
(List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers = (List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
.getPropertyValue("processorConfigurers");
for (AggregateApplicationBuilder.ProcessorConfigurer processorConfigurer : processorConfigurers) {
if (processorConfigurer.getNamespace().equals("b")) {
@@ -286,20 +287,19 @@ public class AggregationTest {
System.setProperty("a.foo-value", "sysbara");
System.setProperty("c.fooValue", "sysbarc");
System.setProperty("server.port", "0");
aggregatedApplicationContext = aggregateApplicationBuilder.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar")
.via(TestProcessor.class).namespace("b").args("--fooValue=argbarb")
.via(TestProcessor.class).namespace("c").args("--foo-value=argbarc")
.run();
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
aggregatedApplicationContext = aggregateApplicationBuilder
.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar").via(TestProcessor.class)
.namespace("b").args("--fooValue=argbarb").via(TestProcessor.class)
.namespace("c").args("--foo-value=argbarc").run();
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
assertTrue(Arrays.equals(
((SourceConfigurer) aggregateApplicationBuilderAccessor.getPropertyValue("sourceConfigurer"))
.getArgs(),
((SourceConfigurer) aggregateApplicationBuilderAccessor
.getPropertyValue("sourceConfigurer")).getArgs(),
new String[] { "--foo-value=sysbara" }));
for (AggregateApplicationBuilder.ProcessorConfigurer processorConfigurer :
((List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
.getPropertyValue(
"processorConfigurers"))) {
for (AggregateApplicationBuilder.ProcessorConfigurer processorConfigurer : ((List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
.getPropertyValue("processorConfigurers"))) {
if (processorConfigurer.getNamespace().equals("b")) {
assertTrue(Arrays.equals(processorConfigurer.getArgs(),
new String[] { "--fooValue=argbarb" }));
@@ -319,15 +319,16 @@ public class AggregationTest {
MockBinderRegistryConfiguration.class);
System.setProperty("a.fooValue", "sysbara");
System.setProperty("c.fooValue", "sysbarc");
aggregatedApplicationContext = aggregateApplicationBuilder.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar")
.via(TestProcessor.class).namespace("b").args("--fooValue=argbarb")
.via(TestProcessor.class).namespace("c").args("--foo-value=argbarc")
.run("--a.fooValue=highest");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(aggregateApplicationBuilder);
assertThat(
((SourceConfigurer) aggregateApplicationBuilderAccessor.getPropertyValue("sourceConfigurer"))
.getArgs()).containsExactly(new String[] { "--fooValue=highest" });
aggregatedApplicationContext = aggregateApplicationBuilder
.parent(DummyConfig.class).web(false).from(TestSource.class)
.namespace("a").args("--foo-value=bar").via(TestProcessor.class)
.namespace("b").args("--fooValue=argbarb").via(TestProcessor.class)
.namespace("c").args("--foo-value=argbarc").run("--a.fooValue=highest");
DirectFieldAccessor aggregateApplicationBuilderAccessor = new DirectFieldAccessor(
aggregateApplicationBuilder);
assertThat(((SourceConfigurer) aggregateApplicationBuilderAccessor
.getPropertyValue("sourceConfigurer")).getArgs())
.containsExactly(new String[] { "--fooValue=highest" });
final List<AggregateApplicationBuilder.ProcessorConfigurer> processorConfigurers = (List<AggregateApplicationBuilder.ProcessorConfigurer>) aggregateApplicationBuilderAccessor
.getPropertyValue("processorConfigurers");
for (AggregateApplicationBuilder.ProcessorConfigurer processorConfigurer : processorConfigurers) {
@@ -353,7 +354,8 @@ public class AggregationTest {
.getBean(SharedBindingTargetRegistry.class);
BindingTargetFactory channelFactory = aggregatedApplicationContext
.getBean(SubscribableChannelBindingTargetFactory.class);
MessageChannel fooOutput = sharedChannelRegistry.get("foo.output", MessageChannel.class);
MessageChannel fooOutput = sharedChannelRegistry.get("foo.output",
MessageChannel.class);
assertThat(fooOutput).isNotNull();
Object barInput = sharedChannelRegistry.get("bar.input", MessageChannel.class);
assertThat(barInput).isNotNull();
@@ -365,9 +367,10 @@ public class AggregationTest {
@Test
public void testBindableProxyFactoryCaching() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
MockBinderRegistryConfiguration.class,
TestSource2.class, TestProcessor.class);
Map<String, BindableProxyFactory> factories = context.getBeansOfType(BindableProxyFactory.class);
MockBinderRegistryConfiguration.class, TestSource2.class,
TestProcessor.class);
Map<String, BindableProxyFactory> factories = context
.getBeansOfType(BindableProxyFactory.class);
assertThat(factories).hasSize(2);
Map<String, Source> sources = context.getBeansOfType(Source.class);
@@ -390,7 +393,8 @@ public class AggregationTest {
}
for (BindableProxyFactory factory : factories.values()) {
Field field = ReflectionUtils.findField(BindableProxyFactory.class, "targetCache");
Field field = ReflectionUtils.findField(BindableProxyFactory.class,
"targetCache");
ReflectionUtils.makeAccessible(field);
Map<?, ?> targetCache = (Map<?, ?>) ReflectionUtils.getField(field, factory);
if (factory.getObjectType() == Source.class) {
@@ -434,7 +438,6 @@ public class AggregationTest {
}
@Configuration
public static class DummyConfig {