Skip to content

Commit

Permalink
CorrelationDataProviders are now automatically configured based on th…
Browse files Browse the repository at this point in the history
…eir availability in the Application Context

When at least one Spring Bean of type CorrelationDataProvider is available in the application context, they are automatically configured as the CorrelationDataProviders to use for all messaging components. If none is present, Axon defaults to the MessageOriginProvider.

Issue AxonFramework#240 Fixed
  • Loading branch information
abuijze committed Jan 23, 2017
1 parent 7b79fc4 commit ba2966a
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import java.util.Map;

/**
* Object defining the the data from a Message that should be attached as correlation data to messages generated as
* Object defining the data from a Message that should be attached as correlation data to messages generated as
* result of the processing of that message.
*
* @author Allard Buijze
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import org.axonframework.eventsourcing.eventstore.jpa.JpaEventStorageEngine;
import org.axonframework.messaging.StreamableMessageSource;
import org.axonframework.messaging.SubscribableMessageSource;
import org.axonframework.messaging.correlation.CorrelationDataProvider;
import org.axonframework.messaging.correlation.MessageOriginProvider;
import org.axonframework.messaging.interceptors.CorrelationDataInterceptor;
import org.axonframework.serialization.Serializer;
import org.axonframework.serialization.xml.XStreamSerializer;
Expand Down Expand Up @@ -79,6 +81,12 @@ public Serializer serializer() {
return new XStreamSerializer();
}

@Bean
@ConditionalOnMissingBean
public CorrelationDataProvider messageOriginProvider() {
return new MessageOriginProvider();
}

@Qualifier("eventStore")
@Bean(name = "eventBus")
@ConditionalOnMissingBean({EventBus.class, EventStore.class})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
import org.axonframework.commandhandling.CommandBus;
import org.axonframework.commandhandling.CommandHandler;
import org.axonframework.commandhandling.gateway.CommandGateway;
import org.axonframework.config.Configurer;
import org.axonframework.eventhandling.EventBus;
import org.axonframework.eventhandling.EventHandler;
import org.axonframework.eventhandling.saga.SagaEventHandler;
import org.axonframework.eventhandling.tokenstore.TokenStore;
import org.axonframework.eventsourcing.eventstore.EventStorageEngine;
import org.axonframework.eventsourcing.eventstore.inmemory.InMemoryEventStorageEngine;
import org.axonframework.messaging.correlation.CorrelationDataProvider;
import org.axonframework.messaging.correlation.SimpleCorrelationDataProvider;
import org.axonframework.serialization.Serializer;
import org.axonframework.spring.config.AxonConfiguration;
import org.axonframework.spring.stereotype.Aggregate;
import org.axonframework.spring.stereotype.Saga;
import org.junit.Test;
Expand All @@ -26,18 +30,26 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

@ContextConfiguration(classes = {DataSourceAutoConfiguration.class,
AxonAutoConfiguration.class,
AxonAutoConfigurationTest.Context.class})
@ContextConfiguration(classes = {
AxonAutoConfigurationTest.Context.class,
DataSourceAutoConfiguration.class,
AxonAutoConfiguration.class})
@RunWith(SpringRunner.class)
public class AxonAutoConfigurationTest {

@Autowired
private ApplicationContext applicationContext;

@Autowired
private Configurer configurer;

@Autowired
private AxonConfiguration configuration;

@Test
public void testContextInitialization() throws Exception {
assertNotNull(applicationContext);
assertNotNull(configurer);

assertNotNull(applicationContext.getBean(CommandBus.class));
assertNotNull(applicationContext.getBean(EventBus.class));
Expand All @@ -47,6 +59,8 @@ public void testContextInitialization() throws Exception {
assertEquals(0, applicationContext.getBeansOfType(TokenStore.class).size());
assertNotNull(applicationContext.getBean(Context.MySaga.class));
assertNotNull(applicationContext.getBean(Context.MyAggregate.class));

assertEquals(2, configuration.correlationDataProviders().size());
}

@Configuration
Expand All @@ -57,6 +71,16 @@ public EventStorageEngine storageEngine() {
return new InMemoryEventStorageEngine();
}

@Bean
public CorrelationDataProvider correlationData1() {
return new SimpleCorrelationDataProvider("key1");
}

@Bean
public CorrelationDataProvider correlationData2() {
return new SimpleCorrelationDataProvider("key2");
}

@Aggregate
public static class MyAggregate {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.axonframework.eventsourcing.eventstore.EventStorageEngine;
import org.axonframework.messaging.annotation.MessageHandler;
import org.axonframework.messaging.annotation.ParameterResolverFactory;
import org.axonframework.messaging.correlation.CorrelationDataProvider;
import org.axonframework.serialization.Serializer;
import org.axonframework.spring.config.annotation.SpringContextParameterResolverFactoryBuilder;
import org.axonframework.spring.eventsourcing.SpringPrototypeAggregateFactory;
Expand All @@ -39,10 +40,12 @@
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.transaction.PlatformTransactionManager;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import static org.axonframework.common.ReflectionUtils.methodsOf;
Expand Down Expand Up @@ -77,6 +80,11 @@ public class SpringAxonAutoConfigurer implements ImportBeanDefinitionRegistrar,
*/
public static final String AXON_CONFIGURATION_BEAN = "org.axonframework.spring.config.AxonConfiguration";

/**
* Name of the {@link Configurer} bean.
*/
public static final String AXON_CONFIGURER_BEAN = "org.axonframework.config.Configurer";

private static final Logger logger = LoggerFactory.getLogger(SpringAxonAutoConfigurer.class);
private ConfigurableListableBeanFactory beanFactory;

Expand Down Expand Up @@ -119,6 +127,7 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
.getBeanDefinition());
configurer.configureResourceInjector(c -> getBean(resourceInjector, c));

registerCorrelationDataProviders(configurer);
registerAggregateBeanDefinitions(configurer, registry);
registerSagaBeanDefinitions(configurer);
registerModules(configurer);
Expand All @@ -129,11 +138,22 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
registry.registerBeanDefinition(ehConfigBeanName, genericBeanDefinition(EventHandlingConfiguration.class)
.getBeanDefinition());
}

beanFactory.registerSingleton(AXON_CONFIGURER_BEAN, configurer);
registry.registerBeanDefinition(AXON_CONFIGURATION_BEAN, genericBeanDefinition(AxonConfiguration.class)
.addConstructorArgValue(configurer).getBeanDefinition());
.addConstructorArgReference(AXON_CONFIGURER_BEAN).getBeanDefinition());
registerEventHandlerRegistrar(ehConfigBeanName, registry);
}

private void registerCorrelationDataProviders(Configurer configurer) {
configurer.configureCorrelationDataProviders(
c -> {
String[] correlationDataProviderBeans = beanFactory.getBeanNamesForType(CorrelationDataProvider.class);
return Arrays.stream(correlationDataProviderBeans)
.map(n -> (CorrelationDataProvider) getBean(n, c)).collect(Collectors.toList());
});
}

@SuppressWarnings("unchecked")
private <T> T getBean(String beanName, Configuration configuration) {
return (T) configuration.getComponent(ApplicationContext.class).getBean(beanName);
Expand Down

0 comments on commit ba2966a

Please sign in to comment.