Skip to content

Commit 70fc304

Browse files
luisgomez29lugomez29juancgalvis
authored
feat: add support for RabbitMQ mandatory property (#145)
* feat: add mandatory property * break circular dependency * feat: implement UnroutableMessageProcessor and refactor message handling * docs: add mandatory property documentation * docs: mandatory property documentation is translated into English * docs: improve formatting and readability of mandatory property documentation * build: update dependencies * build: update version in gradle.properties * Update main.gradle --------- Co-authored-by: lugomez <lugomez@bancolombia.com.co> Co-authored-by: Juan C Galvis <8420868+juancgalvis@users.noreply.github.com>
1 parent 399449d commit 70fc304

File tree

73 files changed

+3412
-2443
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+3412
-2443
lines changed

async/async-commons-api/src/main/java/org/reactivecommons/async/api/HandlerRegistry.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
@Getter
2525
@NoArgsConstructor(access = AccessLevel.PACKAGE)
26+
@SuppressWarnings({"unchecked", "unused"})
2627
public final class HandlerRegistry {
2728
public static final String DEFAULT_DOMAIN = "app";
2829
private final RegisteredDomainHandlers<RegisteredEventListener<?, ?>> domainEventListeners =
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
package org.reactivecommons.async.api.handlers.registered;
22

3-
import lombok.Getter;
4-
import lombok.RequiredArgsConstructor;
53
import org.reactivecommons.async.api.handlers.CommandHandler;
64

7-
@RequiredArgsConstructor
8-
@Getter
9-
public class RegisteredCommandHandler<T,D> {
10-
private final String path;
11-
private final CommandHandler<D> handler;
12-
private final Class<T> inputClass;
5+
public record RegisteredCommandHandler<T, D>(String path, CommandHandler<D> handler, Class<T> inputClass) {
136
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
package org.reactivecommons.async.api.handlers.registered;
22

3-
import lombok.Getter;
4-
import lombok.RequiredArgsConstructor;
53
import org.reactivecommons.async.api.handlers.EventHandler;
64

7-
@RequiredArgsConstructor
8-
@Getter
9-
public class RegisteredEventListener<T, D> {
10-
private final String path;
11-
private final EventHandler<D> handler;
12-
private final Class<T> inputClass;
5+
public record RegisteredEventListener<T, D>(String path, EventHandler<D> handler, Class<T> inputClass) {
136
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
package org.reactivecommons.async.api.handlers.registered;
22

3-
import lombok.Getter;
4-
import lombok.RequiredArgsConstructor;
53
import org.reactivecommons.async.api.handlers.QueryHandlerDelegate;
64

7-
@RequiredArgsConstructor
8-
@Getter
9-
public class RegisteredQueryHandler<T, C> {
10-
private final String path;
11-
private final QueryHandlerDelegate<T, C> handler;
12-
private final Class<C> queryClass;
5+
public record RegisteredQueryHandler<T, C>(String path, QueryHandlerDelegate<T, C> handler, Class<C> queryClass) {
136
}

async/async-commons-api/src/test/java/org/reactivecommons/async/api/HandlerRegistryTest.java

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ void shouldListenDomainEvent() {
3939

4040
assertThat(registry.getDomainEventListeners().get(domain))
4141
.anySatisfy(registered -> assertThat(registered)
42-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
43-
RegisteredEventListener::getHandler
42+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
43+
RegisteredEventListener::handler
4444
)
4545
.containsExactly(name, SomeDataClass.class, eventHandler)).hasSize(1);
4646
}
@@ -53,8 +53,8 @@ void shouldListenDomainCloudEvent() {
5353

5454
assertThat(registry.getDomainEventListeners().get(domain))
5555
.anySatisfy(registered -> assertThat(registered)
56-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
57-
RegisteredEventListener::getHandler
56+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
57+
RegisteredEventListener::handler
5858
)
5959
.containsExactly(name, CloudEvent.class, eventHandler)).hasSize(1);
6060
}
@@ -67,8 +67,8 @@ void shouldListenDomainRawEvent() {
6767

6868
assertThat(registry.getDomainEventListeners().get(DEFAULT_DOMAIN))
6969
.anySatisfy(registered -> assertThat(registered)
70-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
71-
RegisteredEventListener::getHandler
70+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
71+
RegisteredEventListener::handler
7272
)
7373
.containsExactly(name, RawMessage.class, eventHandler)).hasSize(1);
7474
}
@@ -81,8 +81,8 @@ void shouldListenEvent() {
8181

8282
assertThat(registry.getDomainEventListeners().get(DEFAULT_DOMAIN))
8383
.anySatisfy(registered -> assertThat(registered)
84-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
85-
RegisteredEventListener::getHandler
84+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
85+
RegisteredEventListener::handler
8686
)
8787
.containsExactly(name, SomeDataClass.class, eventHandler)).hasSize(1);
8888
}
@@ -95,8 +95,8 @@ void shouldListenCloudEvent() {
9595

9696
assertThat(registry.getDomainEventListeners().get(DEFAULT_DOMAIN))
9797
.anySatisfy(registered -> assertThat(registered)
98-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
99-
RegisteredEventListener::getHandler
98+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
99+
RegisteredEventListener::handler
100100
)
101101
.containsExactly(name, CloudEvent.class, eventHandler)).hasSize(1);
102102
}
@@ -124,14 +124,14 @@ void shouldRegisterPatternEventHandler() {
124124
void shouldRegisterNotificationEventListener() {
125125
registry.listenNotificationEvent(name, message -> Mono.empty(), SomeDataClass.class);
126126
assertThat(registry.getEventNotificationListener().get(DEFAULT_DOMAIN))
127-
.anySatisfy(listener -> assertThat(listener.getPath()).isEqualTo(name));
127+
.anySatisfy(listener -> assertThat(listener.path()).isEqualTo(name));
128128
}
129129

130130
@Test
131131
void shouldRegisterNotificationCloudEventListener() {
132132
registry.listenNotificationCloudEvent(name, message -> Mono.empty());
133133
assertThat(registry.getEventNotificationListener().get(DEFAULT_DOMAIN))
134-
.anySatisfy(listener -> assertThat(listener.getPath()).isEqualTo(name));
134+
.anySatisfy(listener -> assertThat(listener.path()).isEqualTo(name));
135135
}
136136

137137
@Test
@@ -142,8 +142,8 @@ void shouldRegisterNotificationRawEventListener() {
142142

143143
assertThat(registry.getEventNotificationListener().get(DEFAULT_DOMAIN))
144144
.anySatisfy(registered -> assertThat(registered)
145-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
146-
RegisteredEventListener::getHandler
145+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
146+
RegisteredEventListener::handler
147147
)
148148
.containsExactly(nameRawNotification, RawMessage.class, eventHandler)).hasSize(1);
149149
}
@@ -156,8 +156,8 @@ void listenEvent() {
156156

157157
assertThat(registry.getDomainEventListeners().get(DEFAULT_DOMAIN))
158158
.anySatisfy(registered -> assertThat(registered)
159-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
160-
RegisteredEventListener::getHandler
159+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
160+
RegisteredEventListener::handler
161161
)
162162
.containsExactly(name, SomeDataClass.class, handler)).hasSize(1);
163163
}
@@ -170,8 +170,8 @@ void shouldListenDynamicEvent() {
170170

171171
assertThat(registry.getDynamicEventHandlers().get(DEFAULT_DOMAIN))
172172
.anySatisfy(registered -> assertThat(registered)
173-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
174-
RegisteredEventListener::getHandler
173+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
174+
RegisteredEventListener::handler
175175
)
176176
.containsExactly(name, SomeDataClass.class, eventHandler)).hasSize(1);
177177
}
@@ -184,8 +184,8 @@ void shouldListenDynamicCloudEvent() {
184184

185185
assertThat(registry.getDynamicEventHandlers().get(DEFAULT_DOMAIN))
186186
.anySatisfy(registered -> assertThat(registered)
187-
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
188-
RegisteredEventListener::getHandler
187+
.extracting(RegisteredEventListener::path, RegisteredEventListener::inputClass,
188+
RegisteredEventListener::handler
189189
)
190190
.containsExactly(name, CloudEvent.class, eventHandler)).hasSize(1);
191191
}
@@ -198,8 +198,8 @@ void handleDomainCommand() {
198198

199199
assertThat(registry.getCommandHandlers().get(DEFAULT_DOMAIN))
200200
.anySatisfy(registered -> assertThat(registered)
201-
.extracting(RegisteredCommandHandler::getPath, RegisteredCommandHandler::getInputClass,
202-
RegisteredCommandHandler::getHandler
201+
.extracting(RegisteredCommandHandler::path, RegisteredCommandHandler::inputClass,
202+
RegisteredCommandHandler::handler
203203
)
204204
.containsExactly(name, SomeDataClass.class, handler)).hasSize(1);
205205
}
@@ -212,8 +212,8 @@ void handleCloudEventCommand() {
212212

213213
assertThat(registry.getCommandHandlers().get(DEFAULT_DOMAIN))
214214
.anySatisfy(registered -> assertThat(registered)
215-
.extracting(RegisteredCommandHandler::getPath, RegisteredCommandHandler::getInputClass,
216-
RegisteredCommandHandler::getHandler
215+
.extracting(RegisteredCommandHandler::path, RegisteredCommandHandler::inputClass,
216+
RegisteredCommandHandler::handler
217217
)
218218
.containsExactly(name, CloudEvent.class, cloudCommandHandler)).hasSize(1);
219219
}
@@ -226,8 +226,8 @@ void handleRawCommand() {
226226

227227
assertThat(registry.getCommandHandlers().get(DEFAULT_DOMAIN))
228228
.anySatisfy(registered -> assertThat(registered)
229-
.extracting(RegisteredCommandHandler::getPath, RegisteredCommandHandler::getInputClass,
230-
RegisteredCommandHandler::getHandler
229+
.extracting(RegisteredCommandHandler::path, RegisteredCommandHandler::inputClass,
230+
RegisteredCommandHandler::handler
231231
)
232232
.containsExactly(nameRaw, RawMessage.class, eventHandler)).hasSize(1);
233233
}
@@ -240,7 +240,7 @@ void shouldServerCloudEventQuery() {
240240

241241
assertThat(registry.getHandlers().get(DEFAULT_DOMAIN))
242242
.anySatisfy(registered -> assertThat(registered)
243-
.extracting(RegisteredQueryHandler::getPath, RegisteredQueryHandler::getQueryClass)
243+
.extracting(RegisteredQueryHandler::path, RegisteredQueryHandler::queryClass)
244244
.containsExactly(name, CloudEvent.class)).hasSize(1);
245245
}
246246

@@ -250,7 +250,7 @@ void handleCommandWithLambda() {
250250

251251
assertThat(registry.getCommandHandlers().get(DEFAULT_DOMAIN))
252252
.anySatisfy(registered -> assertThat(registered)
253-
.extracting(RegisteredCommandHandler::getPath, RegisteredCommandHandler::getInputClass)
253+
.extracting(RegisteredCommandHandler::path, RegisteredCommandHandler::inputClass)
254254
.containsExactly(name, SomeDataClass.class)).hasSize(1);
255255
}
256256

@@ -260,7 +260,7 @@ void serveQueryWithLambda() {
260260
registry.serveQuery(name, message -> Mono.empty(), SomeDataClass.class);
261261
assertThat(registry.getHandlers().get(DEFAULT_DOMAIN))
262262
.anySatisfy(registered -> assertThat(registered)
263-
.extracting(RegisteredQueryHandler::getPath, RegisteredQueryHandler::getQueryClass)
263+
.extracting(RegisteredQueryHandler::path, RegisteredQueryHandler::queryClass)
264264
.containsExactly(name, SomeDataClass.class)).hasSize(1);
265265
}
266266

@@ -269,9 +269,9 @@ void serveQueryWithTypeInference() {
269269
QueryHandler<SomeDataClass, SomeDataClass> handler = new SomeQueryHandler();
270270
registry.serveQuery(name, handler, SomeDataClass.class);
271271
assertThat(registry.getHandlers().get(DEFAULT_DOMAIN)).anySatisfy(registered -> {
272-
assertThat(registered).extracting(RegisteredQueryHandler::getPath, RegisteredQueryHandler::getQueryClass)
272+
assertThat(registered).extracting(RegisteredQueryHandler::path, RegisteredQueryHandler::queryClass)
273273
.containsExactly(name, SomeDataClass.class);
274-
assertThat(registered).extracting(RegisteredQueryHandler::getHandler)
274+
assertThat(registered).extracting(RegisteredQueryHandler::handler)
275275
.isInstanceOf(QueryHandlerDelegate.class);
276276
}).hasSize(1);
277277
}
@@ -280,19 +280,21 @@ void serveQueryWithTypeInference() {
280280
void serveQueryDelegate() {
281281
QueryHandlerDelegate<Void, SomeDataClass> handler = new SomeQueryHandlerDelegate();
282282
registry.serveQuery(name, handler, SomeDataClass.class);
283-
assertThat(registry.getHandlers().get(DEFAULT_DOMAIN)).anySatisfy(registered -> {
284-
assertThat(registered).extracting(RegisteredQueryHandler::getPath, RegisteredQueryHandler::getQueryClass)
285-
.containsExactly(name, SomeDataClass.class);
286-
}).hasSize(1);
283+
assertThat(registry.getHandlers().get(DEFAULT_DOMAIN)).anySatisfy(registered ->
284+
assertThat(registered)
285+
.extracting(RegisteredQueryHandler::path, RegisteredQueryHandler::queryClass)
286+
.containsExactly(name, SomeDataClass.class))
287+
.hasSize(1);
287288
}
288289

289290
@Test
290291
void serveQueryDelegateWithLambda() {
291292
registry.serveQuery(name, (from, message) -> Mono.empty(), SomeDataClass.class);
292-
assertThat(registry.getHandlers().get(DEFAULT_DOMAIN)).anySatisfy(registered -> {
293-
assertThat(registered).extracting(RegisteredQueryHandler::getPath, RegisteredQueryHandler::getQueryClass)
294-
.containsExactly(name, SomeDataClass.class);
295-
}).hasSize(1);
293+
assertThat(registry.getHandlers().get(DEFAULT_DOMAIN)).anySatisfy(registered ->
294+
assertThat(registered)
295+
.extracting(RegisteredQueryHandler::path, RegisteredQueryHandler::queryClass)
296+
.containsExactly(name, SomeDataClass.class))
297+
.hasSize(1);
296298
}
297299

298300
private static class SomeQueryHandlerDelegate implements QueryHandlerDelegate<Void, SomeDataClass> {

async/async-commons/async-commons.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ dependencies {
1010
compileOnly 'io.projectreactor:reactor-core'
1111
api 'com.fasterxml.jackson.core:jackson-databind'
1212
api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
13-
implementation 'commons-io:commons-io:2.18.0'
13+
implementation 'commons-io:commons-io:2.20.0'
1414
implementation 'io.cloudevents:cloudevents-json-jackson:4.0.1'
1515

1616
testImplementation 'io.projectreactor:reactor-test'

async/async-commons/src/main/java/org/reactivecommons/async/commons/HandlerResolver.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
@Log
1717
@RequiredArgsConstructor
18+
@SuppressWarnings("unchecked")
1819
public class HandlerResolver {
1920

2021
private final Map<String, RegisteredQueryHandler<?, ?>> queryHandlers;
@@ -37,19 +38,16 @@ public boolean hasQueryHandlers() {
3738
return !queryHandlers.isEmpty();
3839
}
3940

40-
@SuppressWarnings("unchecked")
4141
public <T, M> RegisteredQueryHandler<T, M> getQueryHandler(String path) {
4242
return (RegisteredQueryHandler<T, M>) queryHandlers
4343
.computeIfAbsent(path, getMatchHandler(queryHandlers));
4444
}
4545

46-
@SuppressWarnings("unchecked")
4746
public <T, D> RegisteredCommandHandler<T, D> getCommandHandler(String path) {
4847
return (RegisteredCommandHandler<T, D>) commandHandlers
4948
.computeIfAbsent(path, getMatchHandler(commandHandlers));
5049
}
5150

52-
@SuppressWarnings("unchecked")
5351
public <T, D> RegisteredEventListener<T, D> getEventListener(String path) {
5452
if (eventListeners.containsKey(path)) {
5553
return (RegisteredEventListener<T, D>) eventListeners.get(path);
@@ -81,15 +79,15 @@ public List<String> getNotificationNames() {
8179
}
8280

8381
public void addEventListener(RegisteredEventListener<?, ?> listener) {
84-
eventListeners.put(listener.getPath(), listener);
82+
eventListeners.put(listener.path(), listener);
8583
}
8684

8785
public void addQueryHandler(RegisteredQueryHandler<?, ?> handler) {
88-
if (handler.getPath().contains("*") || handler.getPath().contains("#")) {
86+
if (handler.path().contains("*") || handler.path().contains("#")) {
8987
throw new RuntimeException("avoid * or # in dynamic handlers, make sure you have no conflicts with cached" +
9088
" patterns");
9189
}
92-
queryHandlers.put(handler.getPath(), handler);
90+
queryHandlers.put(handler.path(), handler);
9391
}
9492

9593
private <T> Function<String, T> getMatchHandler(Map<String, T> handlers) {

async/async-commons/src/main/java/org/reactivecommons/async/commons/utils/resolver/HandlerResolverBuilder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static HandlerResolver buildResolver(String domain, Map<String, HandlerRe
2929
.getOrDefault(domain, List.of())
3030
.stream())
3131
.collect(ConcurrentHashMap::new, (map, handler)
32-
-> map.put(handler.getPath(), handler), ConcurrentHashMap::putAll
32+
-> map.put(handler.path(), handler), ConcurrentHashMap::putAll
3333
);
3434

3535
final ConcurrentMap<String, RegisteredCommandHandler<?, ?>> commandHandlers = registries
@@ -39,7 +39,7 @@ public static HandlerResolver buildResolver(String domain, Map<String, HandlerRe
3939
.getOrDefault(domain, List.of())
4040
.stream())
4141
.collect(ConcurrentHashMap::new, (map, handler)
42-
-> map.put(handler.getPath(), handler), ConcurrentHashMap::putAll
42+
-> map.put(handler.path(), handler), ConcurrentHashMap::putAll
4343
);
4444

4545
final ConcurrentMap<String, RegisteredEventListener<?, ?>> eventNotificationListener = registries
@@ -49,7 +49,7 @@ public static HandlerResolver buildResolver(String domain, Map<String, HandlerRe
4949
.getOrDefault(domain, List.of())
5050
.stream())
5151
.collect(ConcurrentHashMap::new, (map, handler)
52-
-> map.put(handler.getPath(), handler), ConcurrentHashMap::putAll
52+
-> map.put(handler.path(), handler), ConcurrentHashMap::putAll
5353
);
5454

5555
final ConcurrentMap<String, RegisteredEventListener<?, ?>> eventsToBind = getEventsToBind(domain,
@@ -81,7 +81,7 @@ public <T, D> RegisteredCommandHandler<T, D> getCommandHandler(String path) {
8181
.stream(),
8282
getDynamics(domain, r)))
8383
.collect(ConcurrentHashMap::new, (map, handler)
84-
-> map.put(handler.getPath(), handler), ConcurrentHashMap::putAll
84+
-> map.put(handler.path(), handler), ConcurrentHashMap::putAll
8585
);
8686
}
8787

@@ -100,7 +100,7 @@ public <T, D> RegisteredCommandHandler<T, D> getCommandHandler(String path) {
100100
return Stream.empty();
101101
})
102102
.collect(ConcurrentHashMap::new, (map, handler)
103-
-> map.put(handler.getPath(), handler), ConcurrentHashMap::putAll
103+
-> map.put(handler.path(), handler), ConcurrentHashMap::putAll
104104
);
105105
}
106106
}

async/async-commons/src/test/java/org/reactivecommons/async/commons/utils/matcher/KeyMatcherPerformanceManualTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class KeyMatcherPerformanceManualTest {
2828

2929

3030
@BeforeEach
31-
public void init() {
31+
void init() {
3232
ClassLoader classLoader = getClass().getClassLoader();
3333
File file = new File(Objects.requireNonNull(classLoader.getResource("candidateNamesForMatching.txt")).getFile());
3434
try {

0 commit comments

Comments
 (0)