Skip to content

Commit f510b82

Browse files
committed
Removed ReceiveMessageCompletableFuture
1 parent 239c4f1 commit f510b82

File tree

4 files changed

+176
-254
lines changed

4 files changed

+176
-254
lines changed

services/sqs/src/main/java/software/amazon/awssdk/services/sqs/internal/batchmanager/ReceiveBatchManager.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import java.util.Optional;
1919
import java.util.concurrent.CompletableFuture;
2020
import java.util.concurrent.ScheduledExecutorService;
21+
import java.util.concurrent.TimeUnit;
22+
import java.util.function.Function;
2123
import software.amazon.awssdk.annotations.SdkInternalApi;
2224
import software.amazon.awssdk.services.sqs.SqsAsyncClient;
2325
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
@@ -33,9 +35,7 @@ public class ReceiveBatchManager {
3335
private final ReceiveQueueBuffer receiveQueueBuffer;
3436
private final QueueAttributesManager queueAttributesManager;
3537

36-
public ReceiveBatchManager(SqsAsyncClient sqsClient,
37-
ScheduledExecutorService executor,
38-
ResponseBatchConfiguration config,
38+
public ReceiveBatchManager(SqsAsyncClient sqsClient, ScheduledExecutorService executor, ResponseBatchConfiguration config,
3939
String queueUrl) {
4040
this.sqsClient = sqsClient;
4141
this.executor = executor;
@@ -51,14 +51,15 @@ public CompletableFuture<ReceiveMessageResponse> processRequest(ReceiveMessageRe
5151
}
5252
int numMessages = Optional.ofNullable(rq.maxNumberOfMessages()).orElse(10);
5353

54-
return queueAttributesManager.getReceiveMessageTimeout(rq, config.minReceiveWaitTime())
55-
.thenCompose(waitTimeMs -> {
56-
ReceiveMessageCompletableFuture receiveMessageFuture =
57-
new ReceiveMessageCompletableFuture(numMessages, waitTimeMs);
58-
receiveQueueBuffer.receiveMessage(receiveMessageFuture);
59-
receiveMessageFuture.startWaitTimer(executor);
60-
return receiveMessageFuture.responseCompletableFuture();
61-
});
54+
return queueAttributesManager.getReceiveMessageTimeout(rq, config.minReceiveWaitTime()).thenCompose(waitTimeMs -> {
55+
CompletableFuture<ReceiveMessageResponse> receiveMessageFuture = new CompletableFuture<>();
56+
receiveQueueBuffer.receiveMessage(receiveMessageFuture, numMessages);
57+
CompletableFuture<ReceiveMessageResponse> timeoutFuture = new CompletableFuture<>();
58+
executor.schedule(() -> timeoutFuture.complete(ReceiveMessageResponse.builder().build()), waitTimeMs.toMillis(),
59+
TimeUnit.MILLISECONDS);
60+
return receiveMessageFuture.applyToEither(timeoutFuture, Function.identity());
61+
62+
});
6263
}
6364

6465
public void shutdown() {

services/sqs/src/main/java/software/amazon/awssdk/services/sqs/internal/batchmanager/ReceiveMessageCompletableFuture.java

Lines changed: 0 additions & 90 deletions
This file was deleted.

services/sqs/src/main/java/software/amazon/awssdk/services/sqs/internal/batchmanager/ReceiveQueueBuffer.java

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import java.util.Queue;
2121
import java.util.concurrent.CancellationException;
22+
import java.util.concurrent.CompletableFuture;
2223
import java.util.concurrent.ConcurrentLinkedQueue;
2324
import java.util.concurrent.ScheduledExecutorService;
2425
import java.util.concurrent.atomic.AtomicBoolean;
@@ -38,7 +39,7 @@ public class ReceiveQueueBuffer {
3839
private final QueueAttributesManager queueAttributesManager;
3940

4041
private final Queue<ReceiveSqsMessageHelper> finishedTasks = new ConcurrentLinkedQueue<>();
41-
private final Queue<ReceiveMessageCompletableFuture> futures = new ConcurrentLinkedQueue<>();
42+
private final Queue<FutureRequestWrapper> futures = new ConcurrentLinkedQueue<>();
4243

4344
private final AtomicInteger inflightReceiveMessageBatches = new AtomicInteger(0);
4445
private final AtomicBoolean shutDown = new AtomicBoolean(false);
@@ -55,8 +56,8 @@ public ReceiveQueueBuffer(ScheduledExecutorService executor, SqsAsyncClient sqsC
5556
this.queueAttributesManager = queueAttributesManager;
5657
}
5758

58-
public void receiveMessage(ReceiveMessageCompletableFuture receiveMessageFuture) {
59-
futures.add(receiveMessageFuture);
59+
public void receiveMessage(CompletableFuture<ReceiveMessageResponse> receiveMessageFuture, int numMessages) {
60+
futures.add(new FutureRequestWrapper(receiveMessageFuture, numMessages));
6061
satisfyFuturesFromBuffer();
6162
spawnMoreReceiveTasks();
6263
}
@@ -79,16 +80,15 @@ public void shutdown() {
7980
}
8081

8182
// Clear futures
82-
futures.forEach(future -> {
83-
if (!future.responseCompletableFuture().isDone()) {
84-
future.setFailure(new CancellationException("Shutdown in progress"));
83+
futures.forEach(futureWrapper -> {
84+
if (!futureWrapper.getFuture().isDone()) {
85+
futureWrapper.getFuture().completeExceptionally(new CancellationException("Shutdown in progress"));
8586
}
8687
});
8788
futures.clear();
8889
}
8990
}
9091

91-
9292
private void spawnMoreReceiveTasks() {
9393
if (shutDown.get()) {
9494
return;
@@ -121,7 +121,7 @@ private int determineDesiredBatches() {
121121

122122
if (config.adaptivePrefetching()) {
123123
int totalRequested = futures.stream()
124-
.mapToInt(ReceiveMessageCompletableFuture::requestedSize)
124+
.mapToInt(FutureRequestWrapper::getRequestedSize)
125125
.sum();
126126
int batchesNeededToFulfillFutures = (int) Math.ceil((float) totalRequested / config.maxBatchItems());
127127
desiredBatches = Math.min(batchesNeededToFulfillFutures, desiredBatches);
@@ -130,19 +130,19 @@ private int determineDesiredBatches() {
130130
return desiredBatches;
131131
}
132132

133-
private void fulfillFuture(ReceiveMessageCompletableFuture future, ReceiveSqsMessageHelper messageHelper) {
133+
private void fulfillFuture(FutureRequestWrapper futureWrapper, ReceiveSqsMessageHelper messageHelper) {
134134
List<Message> messages = new LinkedList<>();
135135
Throwable exception = messageHelper.getException();
136136
int numRetrieved = 0;
137137
boolean batchDone = false;
138138

139139
if (exception != null) {
140-
future.setFailure(exception);
140+
futureWrapper.getFuture().completeExceptionally(exception);
141141
finishedTasks.poll();
142142
return;
143143
}
144144

145-
while (numRetrieved < future.requestedSize()) {
145+
while (numRetrieved < futureWrapper.getRequestedSize()) {
146146
Message msg = messageHelper.removeMessage();
147147
if (msg != null) {
148148
messages.add(msg);
@@ -156,7 +156,7 @@ private void fulfillFuture(ReceiveMessageCompletableFuture future, ReceiveSqsMes
156156
if (batchDone) {
157157
finishedTasks.poll();
158158
}
159-
future.setSuccess(ReceiveMessageResponse.builder().messages(messages).build());
159+
futureWrapper.getFuture().complete(ReceiveMessageResponse.builder().messages(messages).build());
160160
}
161161

162162
private void satisfyFuturesFromBuffer() {
@@ -177,7 +177,10 @@ private void satisfyFuturesFromBuffer() {
177177
}
178178

179179
private void pruneExpiredTasks() {
180-
futures.removeIf(ReceiveMessageCompletableFuture::isExpired);
180+
futures.removeIf(futureWrapper -> {
181+
CompletableFuture<ReceiveMessageResponse> future = futureWrapper.getFuture();
182+
return future.isDone();
183+
});
181184
}
182185

183186
private void reportBatchFinished(ReceiveSqsMessageHelper batch) {
@@ -186,4 +189,23 @@ private void reportBatchFinished(ReceiveSqsMessageHelper batch) {
186189
satisfyFuturesFromBuffer();
187190
spawnMoreReceiveTasks();
188191
}
192+
193+
194+
private static class FutureRequestWrapper {
195+
private final CompletableFuture<ReceiveMessageResponse> future;
196+
private final int requestedSize;
197+
198+
FutureRequestWrapper(CompletableFuture<ReceiveMessageResponse> future, int requestedSize) {
199+
this.future = future;
200+
this.requestedSize = requestedSize;
201+
}
202+
203+
public CompletableFuture<ReceiveMessageResponse> getFuture() {
204+
return future;
205+
}
206+
207+
public int getRequestedSize() {
208+
return requestedSize;
209+
}
210+
}
189211
}

0 commit comments

Comments
 (0)