diff --git a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/operations/AbstractMessagingTemplate.java b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/operations/AbstractMessagingTemplate.java index 8a4b1e422..429d39b63 100644 --- a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/operations/AbstractMessagingTemplate.java +++ b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/operations/AbstractMessagingTemplate.java @@ -401,7 +401,12 @@ private CompletableFuture> wrapSendException(Collection< private CompletableFuture> handleFailedSendBatch(String endpoint, SendResult.Batch result) { - return CompletableFuture.failedFuture(new SendBatchOperationFailedException("", endpoint, result)); + String errorMessage = "Send batch operation failed for endpoint %s. Failed messages: %s.".formatted(endpoint, + result.failed().stream() + .map(failed -> "[Message ID: %s, Error: %s]" + .formatted(MessageHeaderUtils.getRawMessageId(failed.message()), failed.errorMessage())) + .collect(Collectors.joining(", "))); + return CompletableFuture.failedFuture(new SendBatchOperationFailedException(errorMessage, endpoint, result)); } private Collection convertMessagesToSend(Collection> messages) { diff --git a/spring-cloud-aws-sqs/src/test/java/io/awspring/cloud/sqs/operations/SqsTemplateTests.java b/spring-cloud-aws-sqs/src/test/java/io/awspring/cloud/sqs/operations/SqsTemplateTests.java index 296543b1a..ce838febc 100644 --- a/spring-cloud-aws-sqs/src/test/java/io/awspring/cloud/sqs/operations/SqsTemplateTests.java +++ b/spring-cloud-aws-sqs/src/test/java/io/awspring/cloud/sqs/operations/SqsTemplateTests.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.*; import com.fasterxml.jackson.databind.ObjectMapper; +import io.awspring.cloud.sqs.MessageHeaderUtils; import io.awspring.cloud.sqs.QueueAttributesResolvingException; import io.awspring.cloud.sqs.SqsAcknowledgementException; import io.awspring.cloud.sqs.listener.QueueNotFoundStrategy; @@ -555,6 +556,8 @@ void shouldThrowIfHasFailedMessagesInBatchByDefault() { assertThatThrownBy(() -> template.sendMany(queue, messages)) .isInstanceOf(SendBatchOperationFailedException.class) .isInstanceOfSatisfying(SendBatchOperationFailedException.class, ex -> { + assertThat(ex.getMessage()).contains(queue).contains(testErrorMessage) + .contains(MessageHeaderUtils.getRawMessageId(message2)); assertThat(ex.getFailedMessages().iterator().next().getPayload()).isEqualTo(payload2); assertThat(ex.getEndpoint()).isEqualTo(queue); SendResult.Batch sendBatchResult = ex.getSendBatchResult(String.class);