26
26
import java .util .concurrent .Executor ;
27
27
import java .util .concurrent .ScheduledExecutorService ;
28
28
import java .util .function .Supplier ;
29
- import org .reactivestreams .Publisher ;
30
29
import org .reactivestreams .Subscriber ;
31
30
import software .amazon .awssdk .annotations .SdkInternalApi ;
32
31
import software .amazon .awssdk .core .Response ;
48
47
import software .amazon .awssdk .core .metrics .CoreMetric ;
49
48
import software .amazon .awssdk .http .SdkHttpFullRequest ;
50
49
import software .amazon .awssdk .http .SdkHttpMethod ;
51
- import software .amazon .awssdk .http .SdkHttpResponse ;
52
50
import software .amazon .awssdk .http .async .AsyncExecuteRequest ;
53
51
import software .amazon .awssdk .http .async .SdkAsyncHttpClient ;
54
52
import software .amazon .awssdk .http .async .SdkHttpContentPublisher ;
@@ -119,59 +117,12 @@ public CompletableFuture<Response<OutputT>> execute(CompletableFuture<SdkHttpFul
119
117
return toReturn ;
120
118
}
121
119
122
- private static final class WrappedErrorForwardingResponseHandler <T >
123
- implements TransformingAsyncResponseHandler <T > {
124
-
125
- private final TransformingAsyncResponseHandler <T > wrappedHandler ;
126
- private final CompletableFuture <T > responseFuture ;
127
-
128
- private WrappedErrorForwardingResponseHandler (TransformingAsyncResponseHandler <T > wrappedHandler ,
129
- CompletableFuture <T > responseFuture ) {
130
- this .wrappedHandler = wrappedHandler ;
131
- this .responseFuture = responseFuture ;
132
-
133
- }
134
-
135
- private static <T > WrappedErrorForwardingResponseHandler <T > of (
136
- TransformingAsyncResponseHandler <T > wrappedHandler ,
137
- CompletableFuture <T > responseFuture ) {
138
-
139
- return new WrappedErrorForwardingResponseHandler <>(wrappedHandler , responseFuture );
140
- }
141
-
142
- @ Override
143
- public CompletableFuture <T > prepare () {
144
- return wrappedHandler .prepare ();
145
- }
146
-
147
- @ Override
148
- public void onHeaders (SdkHttpResponse headers ) {
149
- wrappedHandler .onHeaders (headers );
150
- }
151
-
152
- @ Override
153
- public void onStream (Publisher <ByteBuffer > stream ) {
154
- wrappedHandler .onStream (stream );
155
- }
156
-
157
- @ Override
158
- public void onError (Throwable error ) {
159
- responseFuture .completeExceptionally (error );
160
- wrappedHandler .onError (error );
161
- }
162
- }
163
-
164
120
private CompletableFuture <Response <OutputT >> executeHttpRequest (SdkHttpFullRequest request ,
165
121
RequestExecutionContext context ) {
166
122
167
123
CompletableFuture <Response <OutputT >> responseFuture = new CompletableFuture <>();
168
124
169
- // Wrap the response handler in a layer that will notify the newly created responseFuture when the onError event
170
- // is triggered
171
- TransformingAsyncResponseHandler <Response <OutputT >> wrappedResponseHandler =
172
- WrappedErrorForwardingResponseHandler .of (responseHandler , responseFuture );
173
-
174
- CompletableFuture <Response <OutputT >> responseHandlerFuture = wrappedResponseHandler .prepare ();
125
+ CompletableFuture <Response <OutputT >> responseHandlerFuture = responseHandler .prepare ();
175
126
176
127
SdkHttpContentPublisher requestProvider = context .requestProvider () == null
177
128
? new SimpleHttpContentPublisher (request )
@@ -184,7 +135,7 @@ private CompletableFuture<Response<OutputT>> executeHttpRequest(SdkHttpFullReque
184
135
AsyncExecuteRequest .Builder executeRequestBuilder = AsyncExecuteRequest .builder ()
185
136
.request (requestWithContentLength )
186
137
.requestContentPublisher (requestProvider )
187
- .responseHandler (wrappedResponseHandler )
138
+ .responseHandler (responseHandler )
188
139
.fullDuplex (isFullDuplex (context .executionAttributes ()))
189
140
.metricCollector (httpMetricCollector );
190
141
if (context .executionAttributes ().getAttribute (SDK_HTTP_EXECUTION_ATTRIBUTES ) != null ) {
@@ -224,10 +175,10 @@ private CompletableFuture<Void> doExecuteHttpRequest(RequestExecutionContext con
224
175
CompletableFuture <Void > httpClientFuture = sdkAsyncHttpClient .execute (executeRequest );
225
176
226
177
// Offload the metrics reporting from this stage onto the future completion executor
227
- CompletableFuture <Void > result = httpClientFuture .whenComplete ((r , t ) -> {
178
+ CompletableFuture <Void > result = httpClientFuture .whenCompleteAsync ((r , t ) -> {
228
179
long duration = System .nanoTime () - callStart ;
229
180
metricCollector .reportMetric (CoreMetric .SERVICE_CALL_DURATION , Duration .ofNanos (duration ));
230
- });
181
+ }, futureCompletionExecutor );
231
182
232
183
// Make sure failures on the result future are forwarded to the http client future.
233
184
CompletableFutureUtils .forwardExceptionTo (result , httpClientFuture );
0 commit comments