Skip to content

Commit d902994

Browse files
Upgrade to Spring Modulith 1.3 upgrade (#1317)
* Upgrade to Spring Modulith 1.3.1. * Add Spring Modulith 1.3's header support for externalization. * Pass event into externalization target calculation. To benefit from the Support for SpEL expressions using the event when calculating the routing target. See spring-projects/spring-modulith#881 for details. --------- Co-authored-by: Maciej Walkowiak <[email protected]>
1 parent 425b6c8 commit d902994

File tree

5 files changed

+42
-8
lines changed

5 files changed

+42
-8
lines changed

spring-cloud-aws-dependencies/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<jakarta.mail.version>2.1.0</jakarta.mail.version>
3333
<eclipse.jakarta.mail.version>1.0.0</eclipse.jakarta.mail.version>
3434
<bytebuddy.version>1.14.9</bytebuddy.version>
35-
<spring-modulith.version>1.2.3</spring-modulith.version>
35+
<spring-modulith.version>1.3.1</spring-modulith.version>
3636
<wiremock-standalone.version>3.3.1</wiremock-standalone.version>
3737
<amazon.s3.accessgrants>2.3.0</amazon.s3.accessgrants>
3838
</properties>

spring-cloud-aws-modulith/spring-cloud-aws-modulith-events-sns/src/main/java/io/awspring/cloud/modulith/events/sns/SnsEventExternalizerConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ DelegatingEventExternalizer snsEventExternalizer(EventExternalizationConfigurati
6161
return new DelegatingEventExternalizer(configuration, (target, payload) -> {
6262

6363
var routing = BrokerRouting.of(target, context);
64-
var builder = SnsNotification.builder(payload);
64+
var builder = SnsNotification.builder(payload).headers(configuration.getHeadersFor(payload));
6565
var key = routing.getKey(payload);
6666

6767
// when routing key is set, SNS topic must be a FIFO topic
6868
if (key != null) {
6969
builder.groupId(key);
7070
}
7171

72-
operations.sendNotification(routing.getTarget(), builder.build());
72+
operations.sendNotification(routing.getTarget(payload), builder.build());
7373

7474
return CompletableFuture.completedFuture(null);
7575
});

spring-cloud-aws-modulith/spring-cloud-aws-modulith-events-sns/src/test/java/io/awspring/cloud/modulith/events/sns/SnsEventPublicationIntegrationTests.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static org.assertj.core.api.Assertions.*;
1919
import static org.awaitility.Awaitility.*;
20+
import static org.springframework.modulith.events.EventExternalizationConfiguration.*;
2021

2122
import java.util.Map;
2223
import org.junit.jupiter.api.Test;
@@ -26,13 +27,16 @@
2627
import org.springframework.context.ApplicationEventPublisher;
2728
import org.springframework.context.annotation.Bean;
2829
import org.springframework.modulith.events.ApplicationModuleListener;
30+
import org.springframework.modulith.events.EventExternalizationConfiguration;
2931
import org.springframework.modulith.events.Externalized;
3032
import org.springframework.test.context.DynamicPropertyRegistrar;
3133
import org.springframework.transaction.annotation.Transactional;
3234
import org.testcontainers.containers.localstack.LocalStackContainer;
3335
import org.testcontainers.utility.DockerImageName;
3436
import software.amazon.awssdk.services.sns.SnsClient;
3537
import software.amazon.awssdk.services.sqs.SqsAsyncClient;
38+
import software.amazon.awssdk.services.sqs.model.Message;
39+
import software.amazon.awssdk.services.sqs.model.MessageAttributeValue;
3640
import software.amazon.awssdk.services.sqs.model.QueueAttributeName;
3741

3842
/**
@@ -78,6 +82,13 @@ TestPublisher testPublisher(ApplicationEventPublisher publisher) {
7882
TestListener testListener() {
7983
return new TestListener();
8084
}
85+
86+
@Bean
87+
EventExternalizationConfiguration eventExternalizationConfiguration() {
88+
89+
return externalizing().select(annotatedAsExternalized())
90+
.headers(Object.class, __ -> Map.of("testKey", "testValue")).build();
91+
}
8192
}
8293

8394
@Test // GH-344
@@ -91,15 +102,20 @@ void publishesEventToSns() {
91102
.getQueueAttributes(r -> r.queueUrl(queueUrl).attributeNames(QueueAttributeName.QUEUE_ARN)).join()
92103
.attributes().get(QueueAttributeName.QUEUE_ARN);
93104

94-
snsClient.subscribe(r -> r.topicArn(topicArn).protocol("sqs").endpoint(queueArn));
105+
snsClient.subscribe(r -> r.attributes(Map.of("RawMessageDelivery", "true")).topicArn(topicArn).protocol("sqs")
106+
.endpoint(queueArn));
95107

96108
publisher.publishEvent();
97109

98110
await().untilAsserted(() -> {
99-
100-
var response = sqsAsyncClient.receiveMessage(r -> r.queueUrl(queueUrl)).join();
111+
var response = sqsAsyncClient.receiveMessage(r -> r.queueUrl(queueUrl).messageAttributeNames("testKey"))
112+
.join();
101113

102114
assertThat(response.hasMessages()).isTrue();
115+
116+
// Assert header added
117+
assertThat(response.messages()).extracting(Message::messageAttributes).extracting(it -> it.get("testKey"))
118+
.extracting(MessageAttributeValue::stringValue).containsExactly("testValue");
103119
});
104120
}
105121

spring-cloud-aws-modulith/spring-cloud-aws-modulith-events-sqs/src/main/java/io/awspring/cloud/modulith/events/sqs/SqsEventExternalizerConfiguration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ DelegatingEventExternalizer sqsEventExternalizer(EventExternalizationConfigurati
6363

6464
return CompletableFuture.completedFuture(operations.send(sqsSendOptions -> {
6565

66-
var options = sqsSendOptions.queue(routing.getTarget()).payload(payload);
66+
var options = sqsSendOptions.queue(routing.getTarget(payload))
67+
.headers(configuration.getHeadersFor(payload)).payload(payload);
68+
6769
var key = routing.getKey(payload);
6870

6971
if (key != null) {

spring-cloud-aws-modulith/spring-cloud-aws-modulith-events-sqs/src/test/java/io/awspring/cloud/modulith/events/sqs/SqsEventPublicationIntegrationTests.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static org.assertj.core.api.Assertions.*;
1919
import static org.awaitility.Awaitility.*;
20+
import static org.springframework.modulith.events.EventExternalizationConfiguration.*;
2021

2122
import java.util.Map;
2223
import org.junit.jupiter.api.Test;
@@ -26,12 +27,15 @@
2627
import org.springframework.context.ApplicationEventPublisher;
2728
import org.springframework.context.annotation.Bean;
2829
import org.springframework.modulith.events.ApplicationModuleListener;
30+
import org.springframework.modulith.events.EventExternalizationConfiguration;
2931
import org.springframework.modulith.events.Externalized;
3032
import org.springframework.test.context.DynamicPropertyRegistrar;
3133
import org.springframework.transaction.annotation.Transactional;
3234
import org.testcontainers.containers.localstack.LocalStackContainer;
3335
import org.testcontainers.utility.DockerImageName;
3436
import software.amazon.awssdk.services.sqs.SqsAsyncClient;
37+
import software.amazon.awssdk.services.sqs.model.Message;
38+
import software.amazon.awssdk.services.sqs.model.MessageAttributeValue;
3539
import software.amazon.awssdk.services.sqs.model.QueueAttributeName;
3640

3741
/**
@@ -76,6 +80,13 @@ TestPublisher testPublisher(ApplicationEventPublisher publisher) {
7680
TestListener testListener() {
7781
return new TestListener();
7882
}
83+
84+
@Bean
85+
EventExternalizationConfiguration eventExternalizationConfiguration() {
86+
87+
return externalizing().select(annotatedAsExternalized())
88+
.headers(Object.class, __ -> Map.of("testKey", "testValue")).build();
89+
}
7990
}
8091

8192
@Test
@@ -86,9 +97,14 @@ void publishesEventToSqs() throws Exception {
8697
publisher.publishEvent();
8798

8899
await().untilAsserted(() -> {
89-
var response = sqsAsyncClient.receiveMessage(r -> r.queueUrl(queueUrl)).join();
100+
var response = sqsAsyncClient.receiveMessage(r -> r.queueUrl(queueUrl).messageAttributeNames("testKey"))
101+
.join();
90102

91103
assertThat(response.hasMessages()).isTrue();
104+
105+
// Assert header added
106+
assertThat(response.messages()).extracting(Message::messageAttributes).extracting(it -> it.get("testKey"))
107+
.extracting(MessageAttributeValue::stringValue).containsExactly("testValue");
92108
});
93109
}
94110

0 commit comments

Comments
 (0)