diff --git a/src/main/java/org/springframework/integration/aws/outbound/SnsMessageHandler.java b/src/main/java/org/springframework/integration/aws/outbound/SnsMessageHandler.java index 7ee4b45..efaa617 100644 --- a/src/main/java/org/springframework/integration/aws/outbound/SnsMessageHandler.java +++ b/src/main/java/org/springframework/integration/aws/outbound/SnsMessageHandler.java @@ -29,7 +29,6 @@ import software.amazon.awssdk.services.sns.model.MessageAttributeValue; import software.amazon.awssdk.services.sns.model.PublishRequest; import software.amazon.awssdk.services.sns.model.PublishResponse; -import org.springframework.core.log.LogMessage; import org.springframework.expression.Expression; import org.springframework.expression.TypeLocator; import org.springframework.expression.common.LiteralExpression; @@ -209,32 +208,43 @@ public class SnsMessageHandler extends AbstractAwsMessageHandler + "The 'messageGroupIdExpression' [" + this.messageGroupIdExpression + "] " + + "must not evaluate to null. The failed request message is " + message); - if (this.messageDeduplicationIdExpression != null) { - if (!topicArn.endsWith(".fifo")) { - logger.warn( - LogMessage.format("a messageDeduplicationId will be set for non-FIFO topic '%s'", topicArn)); + publishRequest.messageGroupId(messageGroupId); + + String messageDeduplicationId = null; + if (this.messageDeduplicationIdExpression != null) { + messageDeduplicationId = + this.messageDeduplicationIdExpression.getValue(getEvaluationContext(), message, + String.class); } - String messageDeduplicationId = - this.messageDeduplicationIdExpression.getValue(getEvaluationContext(), message, String.class); + Assert.notNull(messageDeduplicationId, () -> + "The 'messageDeduplicationIdExpression' [" + this.messageDeduplicationIdExpression + "] " + + "must not evaluate to null. The failed request message is " + message); + publishRequest.messageDeduplicationId(messageDeduplicationId); } + else if (this.messageGroupIdExpression != null || this.messageDeduplicationIdExpression != null) { + logger.info("The 'messageGroupIdExpression' and 'messageDeduplicationIdExpression' properties " + + "are ignored for non-FIFO topics."); + } Object snsMessage = message.getPayload(); diff --git a/src/test/java/org/springframework/integration/aws/outbound/SnsMessageHandlerTests.java b/src/test/java/org/springframework/integration/aws/outbound/SnsMessageHandlerTests.java index 9d017be..2d04a2d 100644 --- a/src/test/java/org/springframework/integration/aws/outbound/SnsMessageHandlerTests.java +++ b/src/test/java/org/springframework/integration/aws/outbound/SnsMessageHandlerTests.java @@ -90,7 +90,7 @@ public class SnsMessageHandlerTests { PublishRequest publishRequest = captor.getValue(); assertThat(publishRequest.messageStructure()).isEqualTo("json"); - assertThat(publishRequest.topicArn()).isEqualTo("arn:aws:sns:eu-west-1:111111111111:topic"); + assertThat(publishRequest.topicArn()).isEqualTo("arn:aws:sns:eu-west-1:111111111111:topic.fifo"); assertThat(publishRequest.subject()).isEqualTo("subject"); assertThat(publishRequest.messageGroupId()).isEqualTo("SUBJECT"); assertThat(publishRequest.messageDeduplicationId()).isEqualTo("BAR"); @@ -105,7 +105,7 @@ public class SnsMessageHandlerTests { assertThat(messageAttributes.get("foo").stringValue()).isEqualTo("bar"); assertThat(reply.getHeaders().get(AwsHeaders.MESSAGE_ID)).isEqualTo("111"); - assertThat(reply.getHeaders().get(AwsHeaders.TOPIC)).isEqualTo("arn:aws:sns:eu-west-1:111111111111:topic"); + assertThat(reply.getHeaders().get(AwsHeaders.TOPIC)).isEqualTo("arn:aws:sns:eu-west-1:111111111111:topic.fifo"); assertThat(reply.getPayload()).isSameAs(payload); } @@ -121,7 +121,7 @@ public class SnsMessageHandlerTests { willAnswer(invocation -> CompletableFuture.completedFuture( CreateTopicResponse.builder() - .topicArn("arn:aws:sns:eu-west-1:111111111111:topic") + .topicArn("arn:aws:sns:eu-west-1:111111111111:topic.fifo") .build())) .given(mock) .createTopic(any(Consumer.class));