diff --git a/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3PathMatchingResourcePatternResolver.java b/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3PathMatchingResourcePatternResolver.java index 56a484363..7642155ef 100644 --- a/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3PathMatchingResourcePatternResolver.java +++ b/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3PathMatchingResourcePatternResolver.java @@ -22,7 +22,6 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; @@ -207,7 +206,7 @@ private List findResourcesInBucketWithKeyPattern(String s3BucketName, return s3ObjectKeyMatchesS3KeyPattern; }).peek(s3Object -> LOGGER.debug("Resolved key: {} based on pattern: {}", s3Object.key(), s3KeyPattern)) .map(s3Object -> getResource(S3_PROTOCOL_PREFIX + s3BucketName + "/" + s3Object.key())) - .collect(Collectors.toList()); + .toList(); } /** @@ -259,7 +258,7 @@ private List findMatchingBuckets(String bucketPattern) { bucketNameMatchesBucketPattern); return bucketNameMatchesBucketPattern; }).peek(name -> LOGGER.debug("Resolved bucket name: {} based on pattern: {}", name, bucketPattern)) - .collect(Collectors.toList()); + .toList(); } /** diff --git a/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/integration/S3StreamingMessageSource.java b/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/integration/S3StreamingMessageSource.java index 8942f50e9..4f45b41e6 100644 --- a/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/integration/S3StreamingMessageSource.java +++ b/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/integration/S3StreamingMessageSource.java @@ -18,7 +18,6 @@ import java.util.Collection; import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; import org.springframework.integration.file.remote.AbstractFileInfo; import org.springframework.integration.file.remote.AbstractRemoteFileStreamingMessageSource; import org.springframework.integration.file.remote.RemoteFileTemplate; @@ -47,7 +46,7 @@ public S3StreamingMessageSource(RemoteFileTemplate template, Comparato @Override protected List> asFileInfoList(Collection collection) { - return collection.stream().map(S3FileInfo::new).collect(Collectors.toList()); + return collection.stream().map(S3FileInfo::new).toList(); } @Override diff --git a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/DefaultListenerContainerRegistry.java b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/DefaultListenerContainerRegistry.java index 2246da32c..674af4ffd 100644 --- a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/DefaultListenerContainerRegistry.java +++ b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/DefaultListenerContainerRegistry.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,7 +80,7 @@ public void start() { synchronized (this.lifecycleMonitor) { logger.debug("Starting {}", getClass().getSimpleName()); List> containersToStart = this.listenerContainers.values().stream() - .filter(SmartLifecycle::isAutoStartup).collect(Collectors.toList()); + .filter(SmartLifecycle::isAutoStartup).toList(); LifecycleHandler.get().start(containersToStart); this.running = true; logger.debug("{} started", getClass().getSimpleName()); diff --git a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/InterceptorExecutionFailedException.java b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/InterceptorExecutionFailedException.java index 961ef97ff..9c8dd30b7 100644 --- a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/InterceptorExecutionFailedException.java +++ b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/InterceptorExecutionFailedException.java @@ -17,7 +17,6 @@ import java.util.Collection; import java.util.Collections; -import java.util.stream.Collectors; import org.springframework.messaging.Message; /** @@ -43,7 +42,7 @@ public InterceptorExecutionFailedException(String message, Throwable cause, Mess public InterceptorExecutionFailedException(String message, Throwable cause, Collection> failedMessages) { super(message, cause); - this.failedMessages = failedMessages.stream().map(msg -> (Message) msg).collect(Collectors.toList()); + this.failedMessages = failedMessages.stream().map(msg -> (Message) msg).toList(); } @Override diff --git a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/ListenerExecutionFailedException.java b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/ListenerExecutionFailedException.java index 7e22f5aae..9d9bfa648 100644 --- a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/ListenerExecutionFailedException.java +++ b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/ListenerExecutionFailedException.java @@ -17,7 +17,6 @@ import java.util.Collection; import java.util.Collections; -import java.util.stream.Collectors; import org.jspecify.annotations.Nullable; import org.springframework.messaging.Message; import org.springframework.util.Assert; @@ -41,7 +40,7 @@ public ListenerExecutionFailedException(String message, Throwable cause, Message public ListenerExecutionFailedException(String message, Throwable cause, Collection> failedMessages) { super(message, cause); - this.failedMessages = failedMessages.stream().map(msg -> (Message) msg).collect(Collectors.toList()); + this.failedMessages = failedMessages.stream().map(msg -> (Message) msg).toList(); } /** 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);