Skip to content

Commit 903f202

Browse files
committed
Refactor
1 parent 1e12516 commit 903f202

File tree

13 files changed

+678
-429
lines changed

13 files changed

+678
-429
lines changed

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/sns/SnsAutoConfiguration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import io.awspring.cloud.sns.core.batch.converter.DefaultSnsMessageConverter;
3636
import io.awspring.cloud.sns.core.batch.converter.SnsMessageConverter;
3737
import io.awspring.cloud.sns.core.batch.executor.BatchExecutionStrategy;
38-
import io.awspring.cloud.sns.core.batch.executor.DefaultBatchExecutionStrategy;
38+
import io.awspring.cloud.sns.core.batch.executor.SequentialBatchExecutionStrategy;
3939
import io.awspring.cloud.sns.sms.SnsSmsOperations;
4040
import io.awspring.cloud.sns.sms.SnsSmsTemplate;
4141
import java.util.List;
@@ -146,8 +146,8 @@ public DefaultSnsMessageConverter defaultSnsMessageConverter(Optional<JsonMapper
146146

147147
@ConditionalOnMissingBean(BatchExecutionStrategy.class)
148148
@Bean
149-
public DefaultBatchExecutionStrategy defaultBatchExecutionStrategy(SnsClient snsClient) {
150-
return new DefaultBatchExecutionStrategy(snsClient);
149+
public SequentialBatchExecutionStrategy defaultBatchExecutionStrategy(SnsClient snsClient) {
150+
return new SequentialBatchExecutionStrategy(snsClient);
151151
}
152152

153153
@ConditionalOnMissingBean(SnsBatchOperations.class)

spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsHeaderConverterUtil.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,14 @@
2929
import org.jspecify.annotations.Nullable;
3030
import org.springframework.messaging.Message;
3131
import org.springframework.messaging.MessageHeaders;
32-
import org.springframework.messaging.support.AbstractMessageChannel;
3332
import org.springframework.util.Assert;
3433
import org.springframework.util.MimeType;
3534
import org.springframework.util.NumberUtils;
3635
import software.amazon.awssdk.core.SdkBytes;
37-
import software.amazon.awssdk.services.sns.SnsClient;
3836
import software.amazon.awssdk.services.sns.model.MessageAttributeValue;
3937

4038
/**
41-
* Implementation of {@link AbstractMessageChannel} which is used for converting and sending messages via
42-
* {@link SnsClient} to SNS.
39+
* Util class used to convert {@link Message} headers to SNS messageAttributes.
4340
*
4441
* @author Agim Emruli
4542
* @author Alain Sahli
@@ -49,7 +46,7 @@
4946
*/
5047
public class SnsHeaderConverterUtil {
5148

52-
public static JsonStringEncoder jsonStringEncoder = JsonStringEncoder.create();
49+
private static final JsonStringEncoder jsonStringEncoder = JsonStringEncoder.create();
5350
private static final Log logger = LogFactory.getLog(SnsHeaderConverterUtil.class);
5451

5552
public static Map<String, MessageAttributeValue> toSnsMessageAttributes(Message<?> message) {

spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsHeaders.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,6 @@ public final class SnsHeaders {
4848
*/
4949
public static final String MESSAGE_GROUP_ID_HEADER = "message-group-id";
5050

51-
/**
52-
* Message id for SNS message (applies only to Batch request). The value of this header is set to
53-
* {@link PublishBatchRequestEntry#id()}}.
54-
*/
55-
public static final String MESSAGE_ID = "message-id";
56-
5751
/**
5852
* Message Deduplication id for SNS message. The value of this header is set to
5953
* {@link PublishRequest#messageDeduplicationId()}}}.

spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/batch/SnsBatchOperations.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Collection;
1919
import java.util.Map;
2020

21+
import io.awspring.cloud.sns.core.SnsNotification;
2122
import org.jspecify.annotations.Nullable;
2223
import org.springframework.messaging.Message;
2324
import org.springframework.messaging.MessagingException;
@@ -45,17 +46,33 @@ public interface SnsBatchOperations {
4546
<T> BatchResult sendBatch(String topicName, Collection<Message<T>> messages);
4647

4748
/**
48-
* Converts a collection of payloads to Spring messages and sends them as a batch to the specified SNS topic.
49+
* Converts a collection of POJOs to Spring messages and sends them as a batch to the specified SNS topic.
4950
* Batch API limit, messages will be split into groups of 10.
5051
* <p>
5152
* The result contains information about both successful and failed messages.
5253
*
5354
* @param topicName The logical name of the SNS topic
54-
* @param payload Collection of payloads to convert and send
55+
* @param payloads Collection of payloads to convert and send
5556
* @param <T> The type of the payload
5657
* @return BatchResult containing successful results and errors if there are any
5758
*/
58-
<T> BatchResult convertAndSend(String topicName, Collection<T> payload);
59+
<T> BatchResult convertAndSend(String topicName, Collection<T> payloads);
60+
61+
62+
/**
63+
* Converts a collection of notifications to Spring messages and sends them as a batch to the specified SNS topic.
64+
* Batch API limit, messages will be split into groups of 10.
65+
* <p>
66+
* The result contains information about both successful and failed messages.
67+
*
68+
* @param topicName The logical name of the SNS topic
69+
* @param notifications Collection of {@link SnsNotification} to convert and send
70+
* @param <T> The type of the payload
71+
* @return BatchResult containing successful results and errors if there are any
72+
*/
73+
<T> BatchResult sendBatchNotifications(String topicName, Collection<SnsNotification<T>> notifications);
74+
75+
5976

6077

6178

spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/batch/SnsBatchTemplate.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.awspring.cloud.sns.core.batch;
1717

18+
import io.awspring.cloud.sns.core.SnsNotification;
1819
import io.awspring.cloud.sns.core.TopicArnResolver;
1920
import io.awspring.cloud.sns.core.batch.converter.SnsMessageConverter;
2021
import io.awspring.cloud.sns.core.batch.executor.BatchExecutionStrategy;
@@ -66,21 +67,43 @@ public SnsBatchTemplate(SnsMessageConverter snsMessageConverter, BatchExecutionS
6667
*/
6768
@Override
6869
public <T> BatchResult sendBatch(String topicName, Collection<Message<T>> messages) {
70+
Assert.notNull(topicName, "topicName is required");
71+
Assert.notNull(messages, "messages are required");
72+
6973
var batchList = messages.stream().map(snsMessageConverter::covertMessage).toList();
7074
return batchExecutionStrategy.send(topicArnResolver.resolveTopicArn(topicName), batchList);
7175
}
7276

7377
/**
74-
* Converts a collection of payloads to Spring messages and sends them as a batch to the specified SNS topic.
78+
* Converts a collection of POJOs to Spring messages and sends them as a batch to the specified SNS topic.
79+
*
80+
* @param topicName The logical name of the SNS topic
81+
* @param payloads Collection of payloads to convert and send
82+
* @param <T> The type of the payload
83+
* @return BatchResult containing successful results and any errors
84+
*/
85+
@Override
86+
public <T> BatchResult convertAndSend(String topicName, Collection<T> payloads) {
87+
Assert.notNull(topicName, "topicName is required");
88+
Assert.notNull(payloads, "payloads are required");
89+
var batchList = payloads.stream().map(it -> MessageBuilder.withPayload(it).build()).map(snsMessageConverter::covertMessage).collect(Collectors.toList());
90+
return batchExecutionStrategy.send(topicArnResolver.resolveTopicArn(topicName), batchList);
91+
}
92+
93+
94+
/**
95+
* Converts a collection of {@link SnsNotification} to Spring messages and sends them as a batch to the specified SNS topic.
7596
*
7697
* @param topicName The logical name of the SNS topic
77-
* @param payload Collection of payloads to convert and send
98+
* @param notifications Collection of payloads to convert and send
7899
* @param <T> The type of the payload
79100
* @return BatchResult containing successful results and any errors
80101
*/
81102
@Override
82-
public <T> BatchResult convertAndSend(String topicName, Collection<T> payload) {
83-
var batchList = payload.stream().map(it -> MessageBuilder.withPayload(it).build()).map(snsMessageConverter::covertMessage).collect(Collectors.toList());
103+
public <T> BatchResult sendBatchNotifications(String topicName, Collection<SnsNotification<T>> notifications) {
104+
Assert.notNull(topicName, "topicName is required");
105+
Assert.notNull(notifications, "notifications are required");
106+
var batchList = notifications.stream().map(it -> MessageBuilder.withPayload(it.getPayload()).copyHeaders(it.getHeaders()).build()).map(snsMessageConverter::covertMessage).collect(Collectors.toList());
84107
return batchExecutionStrategy.send(topicArnResolver.resolveTopicArn(topicName), batchList);
85108
}
86109

spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/batch/converter/DefaultSnsMessageConverter.java

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

1818
import static io.awspring.cloud.sns.core.SnsHeaders.MESSAGE_DEDUPLICATION_ID_HEADER;
1919
import static io.awspring.cloud.sns.core.SnsHeaders.MESSAGE_GROUP_ID_HEADER;
20-
import static io.awspring.cloud.sns.core.SnsHeaders.MESSAGE_ID;
20+
import static io.awspring.cloud.sns.core.SnsHeaders.MESSAGE_ID_HEADER;
2121

2222
import io.awspring.cloud.sns.core.SnsHeaderConverterUtil;
2323
import java.util.ArrayList;
@@ -92,7 +92,7 @@ private <T> void populateHeader(PublishBatchRequestEntry.Builder publishBatchReq
9292
publishBatchRequestEntry.messageAttributes(messageAttributes);
9393
}
9494

95-
String id = Optional.ofNullable(message.getHeaders().get(MESSAGE_ID, String.class)).filter(StringUtils::hasText)
95+
String id = Optional.ofNullable(message.getHeaders().get(MESSAGE_ID_HEADER, String.class)).filter(StringUtils::hasText)
9696
.orElseGet(() -> UUID.randomUUID().toString());
9797
publishBatchRequestEntry.id(id);
9898

spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/batch/executor/DefaultBatchExecutionStrategy.java renamed to spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/batch/executor/SequentialBatchExecutionStrategy.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434
* @author Matej Nedic
3535
* @since 4.0.1
3636
*/
37-
public class DefaultBatchExecutionStrategy implements BatchExecutionStrategy {
37+
public class SequentialBatchExecutionStrategy implements BatchExecutionStrategy {
3838

3939
private final SnsClient snsClient;
4040

41-
public DefaultBatchExecutionStrategy(SnsClient snsClient) {
41+
private static final int MAX_SNS_BATCH_SIZE = 10;
42+
43+
public SequentialBatchExecutionStrategy(SnsClient snsClient) {
4244
Assert.notNull(snsClient, "SnsClient cannot be null!");
4345
this.snsClient = snsClient;
4446
}
@@ -52,14 +54,17 @@ public DefaultBatchExecutionStrategy(SnsClient snsClient) {
5254
*/
5355
@Override
5456
public BatchResult send(Arn topicArn, Collection<PublishBatchRequestEntry> entries) {
57+
Assert.notNull(topicArn, "topicArn is required");
58+
Assert.notNull(topicArn, "entries are required");
59+
5560
List<BatchResult.SnsResult> allResults = new ArrayList<>();
5661
List<BatchResult.SnsError> allErrors = new ArrayList<>();
57-
List<PublishBatchRequestEntry> batch = new ArrayList<>(10);
62+
List<PublishBatchRequestEntry> batch = new ArrayList<>(MAX_SNS_BATCH_SIZE);
5863

5964
for (PublishBatchRequestEntry entry : entries) {
6065
batch.add(entry);
6166

62-
if (batch.size() == 10) {
67+
if (batch.size() == MAX_SNS_BATCH_SIZE) {
6368
processBatch(topicArn, batch, allResults, allErrors);
6469
batch.clear();
6570
}

spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/Person.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package io.awspring.cloud.sns;
1717

18+
import java.util.Objects;
19+
1820
public class Person {
1921
private String name;
2022

@@ -32,4 +34,18 @@ public String getName() {
3234
public void setName(String name) {
3335
this.name = name;
3436
}
37+
38+
39+
@Override
40+
public boolean equals(Object object) {
41+
if (this == object) return true;
42+
if (object == null || getClass() != object.getClass()) return false;
43+
Person person = (Person) object;
44+
return Objects.equals(name, person.name);
45+
}
46+
47+
@Override
48+
public int hashCode() {
49+
return Objects.hash(name);
50+
}
3551
}

0 commit comments

Comments
 (0)