Skip to content

Commit 8dbdfeb

Browse files
authored
feat(raw-handler): Raw event handler (#136)
* feat(rawhandler): Allow raw message handler to listening events
1 parent 4235ab8 commit 8dbdfeb

File tree

24 files changed

+220
-20
lines changed

24 files changed

+220
-20
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import lombok.AccessLevel;
55
import lombok.Getter;
66
import lombok.NoArgsConstructor;
7+
import org.reactivecommons.api.domain.RawMessage;
78
import org.reactivecommons.async.api.handlers.CloudCommandHandler;
89
import org.reactivecommons.async.api.handlers.CloudEventHandler;
910
import org.reactivecommons.async.api.handlers.DomainCommandHandler;
1011
import org.reactivecommons.async.api.handlers.DomainEventHandler;
1112
import org.reactivecommons.async.api.handlers.QueryHandler;
1213
import org.reactivecommons.async.api.handlers.QueryHandlerDelegate;
14+
import org.reactivecommons.async.api.handlers.RawEventHandler;
1315
import org.reactivecommons.async.api.handlers.registered.RegisteredCommandHandler;
1416
import org.reactivecommons.async.api.handlers.registered.RegisteredEventListener;
1517
import org.reactivecommons.async.api.handlers.registered.RegisteredQueryHandler;
@@ -50,6 +52,12 @@ public HandlerRegistry listenDomainCloudEvent(String domain, String eventName, C
5052
return this;
5153
}
5254

55+
public HandlerRegistry listenDomainRawEvent(String domain, String eventName, RawEventHandler<?> handler) {
56+
domainEventListeners.computeIfAbsent(domain, ignored -> new CopyOnWriteArrayList<>())
57+
.add(new RegisteredEventListener<>(eventName, handler, RawMessage.class));
58+
return this;
59+
}
60+
5361
public <T> HandlerRegistry listenEvent(String eventName, DomainEventHandler<T> handler, Class<T> eventClass) {
5462
domainEventListeners.computeIfAbsent(DEFAULT_DOMAIN, ignored -> new CopyOnWriteArrayList<>())
5563
.add(new RegisteredEventListener<>(eventName, handler, eventClass));
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.reactivecommons.async.api.handlers;
2+
3+
import org.reactivecommons.api.domain.RawMessage;
4+
5+
public interface RawEventHandler<T extends RawMessage> extends EventHandler<T> {
6+
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
import org.junit.jupiter.api.Test;
66
import org.reactivecommons.api.domain.Command;
77
import org.reactivecommons.api.domain.DomainEvent;
8+
import org.reactivecommons.api.domain.RawMessage;
89
import org.reactivecommons.async.api.handlers.CloudCommandHandler;
910
import org.reactivecommons.async.api.handlers.CloudEventHandler;
1011
import org.reactivecommons.async.api.handlers.DomainCommandHandler;
1112
import org.reactivecommons.async.api.handlers.DomainEventHandler;
1213
import org.reactivecommons.async.api.handlers.QueryHandler;
1314
import org.reactivecommons.async.api.handlers.QueryHandlerDelegate;
15+
import org.reactivecommons.async.api.handlers.RawEventHandler;
1416
import org.reactivecommons.async.api.handlers.registered.RegisteredCommandHandler;
1517
import org.reactivecommons.async.api.handlers.registered.RegisteredEventListener;
1618
import org.reactivecommons.async.api.handlers.registered.RegisteredQueryHandler;
@@ -54,6 +56,20 @@ void shouldListenDomainCloudEvent() {
5456
.containsExactly(name, CloudEvent.class, eventHandler)).hasSize(1);
5557
}
5658

59+
@Test
60+
void shouldListenDomainRawEvent() {
61+
SomeRawEventHandler eventHandler = new SomeRawEventHandler();
62+
63+
registry.listenDomainRawEvent(domain, name, eventHandler);
64+
65+
assertThat(registry.getDomainEventListeners().get(domain))
66+
.anySatisfy(registered -> assertThat(registered)
67+
.extracting(RegisteredEventListener::getPath, RegisteredEventListener::getInputClass,
68+
RegisteredEventListener::getHandler
69+
)
70+
.containsExactly(name, RawMessage.class, eventHandler)).hasSize(1);
71+
}
72+
5773
@Test
5874
void shouldListenEvent() {
5975
SomeDomainEventHandler<SomeDataClass> eventHandler = new SomeDomainEventHandler<>();
@@ -269,6 +285,13 @@ public Mono<Void> handle(CloudEvent message) {
269285
}
270286
}
271287

288+
private static class SomeRawEventHandler implements RawEventHandler<RawMessage> {
289+
@Override
290+
public Mono<Void> handle(RawMessage message) {
291+
return null;
292+
}
293+
}
294+
272295
private static class SomeDomainCommandHandler<SomeDataClass> implements DomainCommandHandler<SomeDataClass> {
273296
@Override
274297
public Mono<Void> handle(Command<SomeDataClass> message) {

async/async-commons/src/main/java/org/reactivecommons/async/commons/communications/Message.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package org.reactivecommons.async.commons.communications;
22

3+
import org.reactivecommons.api.domain.RawMessage;
4+
35
import java.util.Map;
46

57
/**
68
* Simple Internal Message representation
79
*
810
* @author Daniel Bustamante Ospina
911
*/
10-
public interface Message {
12+
public interface Message extends RawMessage {
1113

1214
byte[] getBody();
1315

async/async-kafka/src/main/java/org/reactivecommons/async/kafka/KafkaDomainEventBus.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.RequiredArgsConstructor;
55
import org.reactivecommons.api.domain.DomainEvent;
66
import org.reactivecommons.api.domain.DomainEventBus;
7+
import org.reactivecommons.api.domain.RawMessage;
78
import org.reactivecommons.async.kafka.communications.ReactiveMessageSender;
89
import org.reactivestreams.Publisher;
910

@@ -31,4 +32,14 @@ public Publisher<Void> emit(CloudEvent event) {
3132
public Publisher<Void> emit(String domain, CloudEvent event) {
3233
throw new UnsupportedOperationException(NOT_IMPLEMENTED_YET);
3334
}
35+
36+
@Override
37+
public Publisher<Void> emit(RawMessage event) {
38+
return sender.send(event);
39+
}
40+
41+
@Override
42+
public Publisher<Void> emit(String domain, RawMessage event) {
43+
throw new UnsupportedOperationException(NOT_IMPLEMENTED_YET);
44+
}
3445
}

async/async-kafka/src/main/java/org/reactivecommons/async/kafka/KafkaMessage.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
public class KafkaMessage implements Message {
1616
private final byte[] body;
1717
private final Properties properties;
18+
private final String type;
1819

1920
@Data
2021
public static class KafkaMessageProperties implements Properties {
@@ -30,7 +31,11 @@ public String getContentType() {
3031
}
3132

3233
public static KafkaMessage fromDelivery(ReceiverRecord<String, byte[]> receiverRecord) {
33-
return new KafkaMessage(receiverRecord.value(), createMessageProps(receiverRecord));
34+
return fromDelivery(receiverRecord, null);
35+
}
36+
37+
public static KafkaMessage fromDelivery(ReceiverRecord<String, byte[]> receiverRecord, String type) {
38+
return new KafkaMessage(receiverRecord.value(), createMessageProps(receiverRecord), type);
3439
}
3540

3641
private static Properties createMessageProps(ReceiverRecord<String, byte[]> receiverRecord) {

async/async-kafka/src/main/java/org/reactivecommons/async/kafka/converters/json/KafkaJacksonMessageConverter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public KafkaJacksonMessageConverter(ObjectMapper objectMapper) {
2222

2323
@Override
2424
public Message toMessage(Object object) {
25+
if (object instanceof KafkaMessage) {
26+
return (KafkaMessage) object;
27+
}
2528
byte[] bytes;
2629
try {
2730
String jsonString = this.objectMapper.writeValueAsString(object);
@@ -30,7 +33,7 @@ public Message toMessage(Object object) {
3033
throw new MessageConversionException(FAILED_TO_CONVERT_MESSAGE_CONTENT, e);
3134
}
3235
KafkaMessageProperties props = buildProperties(object);
33-
return new KafkaMessage(bytes, props);
36+
return new KafkaMessage(bytes, props, null);
3437
}
3538

3639
private KafkaMessageProperties buildProperties(Object message) {

async/async-kafka/src/main/java/org/reactivecommons/async/kafka/listeners/GenericMessageListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ protected Mono<ReceiverRecord<String, byte[]>> handle(ReceiverRecord<String, byt
112112
try {
113113
final String executorPath = getExecutorPath(msj);
114114
final Function<Message, Mono<Object>> handler = getExecutor(executorPath);
115-
final Message message = KafkaMessage.fromDelivery(msj);
115+
final Message message = KafkaMessage.fromDelivery(msj, executorPath);
116116

117117
Mono<Object> flow = Mono.defer(() -> handler.apply(message))
118118
.transform(enrichPostProcess(message));

async/async-kafka/src/test/java/org/reactivecommons/async/kafka/KafkaDomainEventBusTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.mockito.Mock;
88
import org.mockito.junit.jupiter.MockitoExtension;
99
import org.reactivecommons.api.domain.DomainEvent;
10+
import org.reactivecommons.api.domain.RawMessage;
1011
import org.reactivecommons.async.kafka.communications.ReactiveMessageSender;
1112
import reactor.core.publisher.Mono;
1213
import reactor.test.StepVerifier;
@@ -21,6 +22,8 @@ class KafkaDomainEventBusTest {
2122
@Mock
2223
private CloudEvent cloudEvent;
2324
@Mock
25+
private RawMessage rawMessage;
26+
@Mock
2427
private ReactiveMessageSender sender;
2528
@InjectMocks
2629
private KafkaDomainEventBus kafkaDomainEventBus;
@@ -48,9 +51,21 @@ void shouldEmitCloudEvent() {
4851
.verifyComplete();
4952
}
5053

54+
@Test
55+
void shouldEmitRawMessage() {
56+
// Arrange
57+
when(sender.send(rawMessage)).thenReturn(Mono.empty());
58+
// Act
59+
Mono<Void> flow = Mono.from(kafkaDomainEventBus.emit(rawMessage));
60+
// Assert
61+
StepVerifier.create(flow)
62+
.verifyComplete();
63+
}
64+
5165
@Test
5266
void operationsShouldNotBeAbleForDomains() {
5367
assertThrows(UnsupportedOperationException.class, () -> kafkaDomainEventBus.emit(domain, domainEvent));
5468
assertThrows(UnsupportedOperationException.class, () -> kafkaDomainEventBus.emit(domain, cloudEvent));
69+
assertThrows(UnsupportedOperationException.class, () -> kafkaDomainEventBus.emit(domain, rawMessage));
5570
}
5671
}

async/async-kafka/src/test/java/org/reactivecommons/async/kafka/converters/json/KafkaJacksonMessageConverterTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void shouldSerializeDomainEvent() {
4242
String expectedJson = "{\"name\":\"test\",\"eventId\":\"" + id + "\",\"data\":{\"name\":\"name\",\"age\":1}}";
4343
// Act
4444
Message message = converter.toMessage(testEvent);
45+
assertEquals(message, converter.toMessage(message));
4546
// Assert
4647
assertEquals("test", message.getProperties().getTopic());
4748
assertEquals(id, message.getProperties().getKey());

0 commit comments

Comments
 (0)