@Bean @ConditionalOnMissingBean({EventProcessingModule.class, EventProcessingConfiguration.class}) public EventProcessingModule eventProcessingModule() { return new EventProcessingModule(); } }
@Override public void initialize(Configuration configuration) { this.configuration = configuration; eventProcessors.clear(); instanceSelectors.sort(comparing(InstanceProcessingGroupSelector::getPriority).reversed()); Map<String, List<Function<Configuration, EventHandlerInvoker>>> handlerInvokers = new HashMap<>(); registerSimpleEventHandlerInvokers(handlerInvokers); registerSagaManagers(handlerInvokers); handlerInvokers.forEach((processorName, invokers) -> { Component<EventProcessor> eventProcessorComponent = new Component<>(configuration, processorName, c -> buildEventProcessor(invokers, processorName)); eventProcessors.put(processorName, eventProcessorComponent); }); }
private String processorNameForProcessingGroup(String processingGroup) { ensureInitialized(); return processingGroupsAssignments.getOrDefault(processingGroup, defaultProcessingGroupAssignment .apply(processingGroup)); }
@SuppressWarnings("unchecked") @Override public <T extends EventProcessor> Optional<T> eventProcessorByProcessingGroup(String processingGroup) { ensureInitialized(); return Optional.ofNullable((T) eventProcessors().get(processorNameForProcessingGroup(processingGroup))); }
@Override public List<MessageHandlerInterceptor<? super EventMessage<?>>> interceptorsFor(String processorName) { ensureInitialized(); return eventProcessor(processorName).map(EventProcessor::getHandlerInterceptors) .orElse(Collections.emptyList()); }
private TrackingEventProcessor trackingEventProcessor(String name, EventHandlerInvoker eventHandlerInvoker, TrackingEventProcessorConfiguration config, StreamableMessageSource<TrackedEventMessage<?>> source) { return TrackingEventProcessor.builder() .name(name) .eventHandlerInvoker(eventHandlerInvoker) .rollbackConfiguration(rollbackConfiguration(name)) .errorHandler(errorHandler(name)) .messageMonitor(messageMonitor(TrackingEventProcessor.class, name)) .messageSource(source) .tokenStore(tokenStore(name)) .transactionManager(transactionManager(name)) .trackingEventProcessorConfiguration(config) .build(); }
.findFirst() .orElse(defaultInstanceSelector.select(handler) .orElse(selectProcessingGroupByType( handler.getClass()))); assignments.computeIfAbsent(processingGroup, k -> new ArrayList<>()) }); assignments.forEach((processingGroup, handlers) -> { String processorName = processorNameForProcessingGroup(processingGroup); handlerInvokers.computeIfAbsent(processorName, k -> new ArrayList<>()).add( c -> SimpleEventHandlerInvoker.builder() .eventHandlers(handlers) .parameterResolverFactory(configuration.parameterResolverFactory()) .listenerInvocationErrorHandler(listenerInvocationErrorHandler( processingGroup )) .sequencingPolicy(sequencingPolicy(processingGroup)) .build()); });
private SubscribingEventProcessor subscribingEventProcessor(String name, Configuration conf, EventHandlerInvoker eventHandlerInvoker, Function<Configuration, SubscribableMessageSource<? extends EventMessage<?>>> messageSource) { return SubscribingEventProcessor.builder() .name(name) .eventHandlerInvoker(eventHandlerInvoker) .rollbackConfiguration(rollbackConfiguration(name)) .errorHandler(errorHandler(name)) .messageMonitor(messageMonitor(SubscribingEventProcessor.class, name)) .messageSource(messageSource.apply(conf)) .processingStrategy(DirectEventProcessingStrategy.INSTANCE) .build(); }
private void registerSagaManagers(Map<String, List<Function<Configuration, EventHandlerInvoker>>> handlerInvokers) { sagaConfigurations.forEach(sc -> { SagaConfiguration<?> sagaConfig = sc.initialize(configuration); String processingGroup = selectProcessingGroupByType(sagaConfig.type()); String processorName = processorNameForProcessingGroup(processingGroup); handlerInvokers.computeIfAbsent(processorName, k -> new ArrayList<>()) .add(c -> sagaConfig.manager()); }); }
@Override public EventProcessingConfigurer registerHandlerInterceptor(String processorName, Function<Configuration, MessageHandlerInterceptor<? super EventMessage<?>>> interceptorBuilder) { if (configuration != null) { eventProcessor(processorName).ifPresent(eventProcessor -> eventProcessor .registerHandlerInterceptor(interceptorBuilder.apply(configuration))); } this.handlerInterceptorsBuilders.computeIfAbsent(processorName, k -> new ArrayList<>()) .add(interceptorBuilder); return this; }
private TrackingEventProcessor trackingEventProcessor(String name, EventHandlerInvoker eventHandlerInvoker, TrackingEventProcessorConfiguration config, StreamableMessageSource<TrackedEventMessage<?>> source) { return TrackingEventProcessor.builder() .name(name) .eventHandlerInvoker(eventHandlerInvoker) .rollbackConfiguration(rollbackConfiguration(name)) .errorHandler(errorHandler(name)) .messageMonitor(messageMonitor(TrackingEventProcessor.class, name)) .messageSource(source) .tokenStore(tokenStore(name)) .transactionManager(transactionManager(name)) .trackingEventProcessorConfiguration(config) .build(); }
.findFirst() .orElse(defaultInstanceSelector.select(handler) .orElse(selectProcessingGroupByType( handler.getClass()))); assignments.computeIfAbsent(processingGroup, k -> new ArrayList<>()) }); assignments.forEach((processingGroup, handlers) -> { String processorName = processorNameForProcessingGroup(processingGroup); handlerInvokers.computeIfAbsent(processorName, k -> new ArrayList<>()).add( c -> SimpleEventHandlerInvoker.builder() .eventHandlers(handlers) .parameterResolverFactory(configuration.parameterResolverFactory()) .listenerInvocationErrorHandler(listenerInvocationErrorHandler( processingGroup )) .sequencingPolicy(sequencingPolicy(processingGroup)) .build()); });
@SuppressWarnings("unchecked") @Override public <T extends EventProcessor> Optional<T> eventProcessorByProcessingGroup(String processingGroup) { ensureInitialized(); return Optional.ofNullable((T) eventProcessors().get(processorNameForProcessingGroup(processingGroup))); }
private SubscribingEventProcessor subscribingEventProcessor(String name, Configuration conf, EventHandlerInvoker eventHandlerInvoker, Function<Configuration, SubscribableMessageSource<? extends EventMessage<?>>> messageSource) { return SubscribingEventProcessor.builder() .name(name) .eventHandlerInvoker(eventHandlerInvoker) .rollbackConfiguration(rollbackConfiguration(name)) .errorHandler(errorHandler(name)) .messageMonitor(messageMonitor(SubscribingEventProcessor.class, name)) .messageSource(messageSource.apply(conf)) .processingStrategy(DirectEventProcessingStrategy.INSTANCE) .build(); }
private void registerSagaManagers(Map<String, List<Function<Configuration, EventHandlerInvoker>>> handlerInvokers) { sagaConfigurations.forEach(sc -> { SagaConfiguration<?> sagaConfig = sc.initialize(configuration); String processingGroup = selectProcessingGroupByType(sagaConfig.type()); String processorName = processorNameForProcessingGroup(processingGroup); handlerInvokers.computeIfAbsent(processorName, k -> new ArrayList<>()) .add(c -> sagaConfig.manager()); }); }
@Override public List<MessageHandlerInterceptor<? super EventMessage<?>>> interceptorsFor(String processorName) { ensureInitialized(); return eventProcessor(processorName).map(EventProcessor::getHandlerInterceptors) .orElse(Collections.emptyList()); }
@Override public EventProcessingConfigurer registerHandlerInterceptor(String processorName, Function<Configuration, MessageHandlerInterceptor<? super EventMessage<?>>> interceptorBuilder) { if (configuration != null) { eventProcessor(processorName).ifPresent(eventProcessor -> eventProcessor .registerHandlerInterceptor(interceptorBuilder.apply(configuration))); } this.handlerInterceptorsBuilders.computeIfAbsent(processorName, k -> new ArrayList<>()) .add(interceptorBuilder); return this; }
@Override public EventProcessingConfigurer eventProcessing() { List<EventProcessingConfigurer> eventProcessingConfigurers = modules.stream() .filter(module -> module.isType(EventProcessingConfigurer.class)) .map(module -> (EventProcessingConfigurer) module.unwrap()) // It's safe to unwrap it since it isn't dependent on anything else. .collect(toList()); switch (eventProcessingConfigurers.size()) { case 0: EventProcessingModule eventProcessingModule = new EventProcessingModule(); registerModule(eventProcessingModule); return eventProcessingModule; case 1: return eventProcessingConfigurers.get(0); default: throw new AxonConfigurationException( "There are several EventProcessingConfigurers defined. " + "The `eventProcessing()` method is used to retrieve a 'singleton' EventProcessingConfigurer." ); } }
@Override public List<SagaConfiguration<?>> sagaConfigurations() { ensureInitialized(); return sagaConfigurations.stream().map(sc -> sc.initialize(configuration)).collect(Collectors.toList()); }
@Override public void initialize(Configuration configuration) { this.configuration = configuration; eventProcessors.clear(); instanceSelectors.sort(comparing(InstanceProcessingGroupSelector::getPriority).reversed()); Map<String, List<Function<Configuration, EventHandlerInvoker>>> handlerInvokers = new HashMap<>(); registerSimpleEventHandlerInvokers(handlerInvokers); registerSagaManagers(handlerInvokers); handlerInvokers.forEach((processorName, invokers) -> { Component<EventProcessor> eventProcessorComponent = new Component<>(configuration, processorName, c -> buildEventProcessor(invokers, processorName)); eventProcessors.put(processorName, eventProcessorComponent); }); }