Skip to content

Commit 5aa3245

Browse files
committed
fix(circular-dependency): Extract listener config and remove handler resolver from replies listener
1 parent 5c8738c commit 5aa3245

File tree

15 files changed

+97
-82
lines changed

15 files changed

+97
-82
lines changed

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/broker/BrokerProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public interface BrokerProvider<T extends GenericAsyncProps> {
1313

1414
DomainEventBus getDomainBus();
1515

16-
DirectAsyncGateway getDirectAsyncGateway(HandlerResolver resolver);
16+
DirectAsyncGateway getDirectAsyncGateway();
1717

1818
void listenDomainEvents(HandlerResolver resolver);
1919

@@ -23,7 +23,7 @@ public interface BrokerProvider<T extends GenericAsyncProps> {
2323

2424
void listenQueries(HandlerResolver resolver);
2525

26-
void listenReplies(HandlerResolver resolver);
26+
void listenReplies();
2727

2828
Mono<RCHealth> healthCheck();
2929
}

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/ReactiveCommonsConfig.java

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,9 @@
44
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
55
import lombok.RequiredArgsConstructor;
66
import lombok.extern.java.Log;
7-
import org.reactivecommons.async.api.DefaultCommandHandler;
8-
import org.reactivecommons.async.api.DefaultQueryHandler;
9-
import org.reactivecommons.async.api.HandlerRegistry;
10-
import org.reactivecommons.async.commons.HandlerResolver;
11-
import org.reactivecommons.async.commons.HandlerResolverBuilder;
127
import org.reactivecommons.async.commons.config.BrokerConfig;
138
import org.reactivecommons.async.commons.converters.json.DefaultObjectMapperSupplier;
149
import org.reactivecommons.async.commons.converters.json.ObjectMapperSupplier;
15-
import org.reactivecommons.async.commons.ext.CustomReporter;
16-
import org.reactivecommons.async.commons.ext.DefaultCustomReporter;
1710
import org.reactivecommons.async.commons.reply.ReactiveReplyRouter;
1811
import org.reactivecommons.async.starter.broker.BrokerProvider;
1912
import org.reactivecommons.async.starter.broker.BrokerProviderFactory;
@@ -27,7 +20,6 @@
2720
import org.springframework.context.annotation.ComponentScan;
2821
import org.springframework.context.annotation.Configuration;
2922
import org.springframework.context.annotation.Import;
30-
import reactor.core.publisher.Mono;
3123

3224
import java.util.Map;
3325

@@ -66,24 +58,6 @@ public ConnectionManager buildConnectionManager(ApplicationContext context) {
6658
return connectionManager;
6759
}
6860

69-
@Bean
70-
@SuppressWarnings({"rawtypes", "unchecked"})
71-
public DomainHandlers buildHandlers(ApplicationContext context,
72-
HandlerRegistry primaryRegistry, DefaultCommandHandler<?> commandHandler) {
73-
DomainHandlers handlers = new DomainHandlers();
74-
final Map<String, HandlerRegistry> registries = context.getBeansOfType(HandlerRegistry.class);
75-
if (!registries.containsValue(primaryRegistry)) {
76-
registries.put("primaryHandlerRegistry", primaryRegistry);
77-
}
78-
final Map<String, GenericAsyncPropsDomain> props = context.getBeansOfType(GenericAsyncPropsDomain.class);
79-
props.forEach((beanName, properties) -> properties.forEach((domain, asyncProps) -> {
80-
String domainName = (String) domain;
81-
HandlerResolver resolver = HandlerResolverBuilder.buildResolver(domainName, registries, commandHandler);
82-
handlers.add(domainName, resolver);
83-
}));
84-
return handlers;
85-
}
86-
8761
@Bean
8862
@ConditionalOnMissingBean
8963
public BrokerConfig brokerConfig() {
@@ -96,33 +70,6 @@ public ObjectMapperSupplier objectMapperSupplier() {
9670
return new DefaultObjectMapperSupplier();
9771
}
9872

99-
@Bean
100-
@ConditionalOnMissingBean
101-
public CustomReporter reactiveCommonsCustomErrorReporter() {
102-
return new DefaultCustomReporter();
103-
}
104-
105-
@Bean
106-
@ConditionalOnMissingBean
107-
@SuppressWarnings("rawtypes")
108-
public DefaultQueryHandler defaultHandler() {
109-
return (DefaultQueryHandler<Object, Object>) command ->
110-
Mono.error(new RuntimeException("No Handler Registered"));
111-
}
112-
113-
@Bean
114-
@ConditionalOnMissingBean
115-
@SuppressWarnings("rawtypes")
116-
public DefaultCommandHandler defaultCommandHandler() {
117-
return message -> Mono.error(new RuntimeException("No Handler Registered"));
118-
}
119-
120-
@Bean
121-
@ConditionalOnMissingBean
122-
public HandlerRegistry defaultHandlerRegistry() {
123-
return HandlerRegistry.register();
124-
}
125-
12673
@Bean
12774
@ConditionalOnMissingBean(ReactiveReplyRouter.class)
12875
public ReactiveReplyRouter defaultReactiveReplyRouter() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.reactivecommons.async.starter.config;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.java.Log;
5+
import org.reactivecommons.async.api.DefaultCommandHandler;
6+
import org.reactivecommons.async.api.DefaultQueryHandler;
7+
import org.reactivecommons.async.api.HandlerRegistry;
8+
import org.reactivecommons.async.commons.HandlerResolver;
9+
import org.reactivecommons.async.commons.HandlerResolverBuilder;
10+
import org.reactivecommons.async.commons.ext.CustomReporter;
11+
import org.reactivecommons.async.commons.ext.DefaultCustomReporter;
12+
import org.reactivecommons.async.starter.props.GenericAsyncPropsDomain;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
14+
import org.springframework.context.ApplicationContext;
15+
import org.springframework.context.annotation.Bean;
16+
import org.springframework.context.annotation.Configuration;
17+
import reactor.core.publisher.Mono;
18+
19+
import java.util.Map;
20+
21+
@Log
22+
@Configuration
23+
@RequiredArgsConstructor
24+
public class ReactiveCommonsListenersConfig {
25+
26+
@Bean
27+
@SuppressWarnings({"rawtypes", "unchecked"})
28+
public DomainHandlers buildHandlers(ApplicationContext context,
29+
HandlerRegistry primaryRegistry, DefaultCommandHandler<?> commandHandler) {
30+
DomainHandlers handlers = new DomainHandlers();
31+
final Map<String, HandlerRegistry> registries = context.getBeansOfType(HandlerRegistry.class);
32+
if (!registries.containsValue(primaryRegistry)) {
33+
registries.put("primaryHandlerRegistry", primaryRegistry);
34+
}
35+
final Map<String, GenericAsyncPropsDomain> props = context.getBeansOfType(GenericAsyncPropsDomain.class);
36+
props.forEach((beanName, properties) -> properties.forEach((domain, asyncProps) -> {
37+
String domainName = (String) domain;
38+
HandlerResolver resolver = HandlerResolverBuilder.buildResolver(domainName, registries, commandHandler);
39+
handlers.add(domainName, resolver);
40+
}));
41+
return handlers;
42+
}
43+
44+
@Bean
45+
@ConditionalOnMissingBean
46+
public CustomReporter reactiveCommonsCustomErrorReporter() {
47+
return new DefaultCustomReporter();
48+
}
49+
50+
@Bean
51+
@ConditionalOnMissingBean
52+
@SuppressWarnings("rawtypes")
53+
public DefaultQueryHandler defaultHandler() {
54+
return (DefaultQueryHandler<Object, Object>) command ->
55+
Mono.error(new RuntimeException("No Handler Registered"));
56+
}
57+
58+
@Bean
59+
@ConditionalOnMissingBean
60+
@SuppressWarnings("rawtypes")
61+
public DefaultCommandHandler defaultCommandHandler() {
62+
return message -> Mono.error(new RuntimeException("No Handler Registered"));
63+
}
64+
65+
@Bean
66+
@ConditionalOnMissingBean
67+
public HandlerRegistry defaultHandlerRegistry() {
68+
return HandlerRegistry.register();
69+
}
70+
}

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/listeners/CommandsListenerConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22

33

44
import org.reactivecommons.async.commons.HandlerResolver;
5-
import org.reactivecommons.async.starter.config.ConnectionManager;
65
import org.reactivecommons.async.starter.broker.BrokerProvider;
6+
import org.reactivecommons.async.starter.config.ConnectionManager;
77
import org.reactivecommons.async.starter.config.DomainHandlers;
88
import org.reactivecommons.async.starter.config.ReactiveCommonsConfig;
9+
import org.reactivecommons.async.starter.config.ReactiveCommonsListenersConfig;
910
import org.springframework.context.annotation.Configuration;
1011
import org.springframework.context.annotation.Import;
1112

1213
@Configuration
13-
@Import(ReactiveCommonsConfig.class)
14+
@Import({ReactiveCommonsConfig.class, ReactiveCommonsListenersConfig.class})
1415
public class CommandsListenerConfig extends AbstractListenerConfig {
1516

1617
public CommandsListenerConfig(ConnectionManager manager, DomainHandlers handlers) {

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/listeners/EventsListenerConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
import org.reactivecommons.async.starter.broker.BrokerProvider;
77
import org.reactivecommons.async.starter.config.DomainHandlers;
88
import org.reactivecommons.async.starter.config.ReactiveCommonsConfig;
9+
import org.reactivecommons.async.starter.config.ReactiveCommonsListenersConfig;
910
import org.springframework.context.annotation.Configuration;
1011
import org.springframework.context.annotation.Import;
1112

1213
@Configuration
13-
@Import(ReactiveCommonsConfig.class)
14+
@Import({ReactiveCommonsConfig.class, ReactiveCommonsListenersConfig.class})
1415
public class EventsListenerConfig extends AbstractListenerConfig {
1516

1617
public EventsListenerConfig(ConnectionManager manager, DomainHandlers handlers) {

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/listeners/NotificationEventsListenerConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
import org.reactivecommons.async.starter.broker.BrokerProvider;
77
import org.reactivecommons.async.starter.config.DomainHandlers;
88
import org.reactivecommons.async.starter.config.ReactiveCommonsConfig;
9+
import org.reactivecommons.async.starter.config.ReactiveCommonsListenersConfig;
910
import org.springframework.context.annotation.Configuration;
1011
import org.springframework.context.annotation.Import;
1112

1213
@Configuration
13-
@Import(ReactiveCommonsConfig.class)
14+
@Import({ReactiveCommonsConfig.class, ReactiveCommonsListenersConfig.class})
1415
public class NotificationEventsListenerConfig extends AbstractListenerConfig {
1516

1617
public NotificationEventsListenerConfig(ConnectionManager manager, DomainHandlers handlers) {

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/listeners/QueriesListenerConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22

33

44
import org.reactivecommons.async.commons.HandlerResolver;
5-
import org.reactivecommons.async.starter.config.ConnectionManager;
65
import org.reactivecommons.async.starter.broker.BrokerProvider;
6+
import org.reactivecommons.async.starter.config.ConnectionManager;
77
import org.reactivecommons.async.starter.config.DomainHandlers;
88
import org.reactivecommons.async.starter.config.ReactiveCommonsConfig;
9+
import org.reactivecommons.async.starter.config.ReactiveCommonsListenersConfig;
910
import org.springframework.context.annotation.Configuration;
1011
import org.springframework.context.annotation.Import;
1112

1213
@Configuration
13-
@Import(ReactiveCommonsConfig.class)
14+
@Import({ReactiveCommonsConfig.class, ReactiveCommonsListenersConfig.class})
1415
public class QueriesListenerConfig extends AbstractListenerConfig {
1516

1617
public QueriesListenerConfig(ConnectionManager manager, DomainHandlers handlers) {

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/senders/DirectAsyncGatewayConfig.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import lombok.extern.java.Log;
55
import org.reactivecommons.async.api.DirectAsyncGateway;
66
import org.reactivecommons.async.starter.config.ConnectionManager;
7-
import org.reactivecommons.async.starter.config.DomainHandlers;
87
import org.reactivecommons.async.starter.config.ReactiveCommonsConfig;
98
import org.springframework.context.annotation.Bean;
109
import org.springframework.context.annotation.Configuration;
@@ -20,10 +19,10 @@
2019
public class DirectAsyncGatewayConfig {
2120

2221
@Bean
23-
public DirectAsyncGateway genericDirectAsyncGateway(ConnectionManager manager, DomainHandlers handlers) {
22+
public DirectAsyncGateway genericDirectAsyncGateway(ConnectionManager manager) {
2423
ConcurrentMap<String, DirectAsyncGateway> directAsyncGateways = new ConcurrentHashMap<>();
2524
manager.forDomain((domain, provider) -> directAsyncGateways.put(domain,
26-
provider.getDirectAsyncGateway(handlers.get(domain))));
25+
provider.getDirectAsyncGateway()));
2726
return new GenericDirectAsyncGateway(directAsyncGateways);
2827
}
2928
}

starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/mybroker/MyBrokerProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void listenQueries(HandlerResolver resolver) {
5252
}
5353

5454
@Override
55-
public void listenReplies(HandlerResolver resolver) {
55+
public void listenReplies() {
5656
// for testing purposes
5757
}
5858

starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/senders/DirectAsyncGatewayConfigTest.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@
99
import org.reactivecommons.async.commons.HandlerResolver;
1010
import org.reactivecommons.async.starter.broker.BrokerProvider;
1111
import org.reactivecommons.async.starter.config.ConnectionManager;
12-
import org.reactivecommons.async.starter.config.DomainHandlers;
1312

1413
import static org.junit.jupiter.api.Assertions.assertNotNull;
15-
import static org.mockito.ArgumentMatchers.any;
1614
import static org.mockito.Mockito.times;
1715
import static org.mockito.Mockito.verify;
1816
import static org.mockito.Mockito.when;
@@ -40,14 +38,11 @@ void setUp() {
4038
@Test
4139
void shouldCreateAllDomainEventBuses() {
4240
// Arrange
43-
when(brokerProvider.getDirectAsyncGateway(any())).thenReturn(domainEventBus);
44-
DomainHandlers handlers = new DomainHandlers();
45-
handlers.add("domain", resolver);
46-
handlers.add("domain2", resolver);
41+
when(brokerProvider.getDirectAsyncGateway()).thenReturn(domainEventBus);
4742
// Act
48-
DirectAsyncGateway genericDomainEventBus = directAsyncGatewayConfig.genericDirectAsyncGateway(manager, handlers);
43+
DirectAsyncGateway genericDomainEventBus = directAsyncGatewayConfig.genericDirectAsyncGateway(manager);
4944
// Assert
5045
assertNotNull(genericDomainEventBus);
51-
verify(brokerProvider, times(2)).getDirectAsyncGateway(resolver);
46+
verify(brokerProvider, times(2)).getDirectAsyncGateway();
5247
}
5348
}

0 commit comments

Comments
 (0)