Class IdempotentAsyncResponseHandler<T,R>
- java.lang.Object
-
- software.amazon.awssdk.core.internal.http.IdempotentAsyncResponseHandler<T,R>
-
- Type Parameters:
T- The type of the wrappedTransformingAsyncResponseHandlerR- The type of the object used to determine scope.
- All Implemented Interfaces:
TransformingAsyncResponseHandler<T>,SdkAsyncHttpResponseHandler
@SdkInternalApi @ThreadSafe public class IdempotentAsyncResponseHandler<T,R> extends Object implements TransformingAsyncResponseHandler<T>
Wrapper for aTransformingAsyncResponseHandlerthat allows attachment to an external scope and given a way of evaluating whether that scope has changed or not will only allow prepare() to be called on its delegate once per state change and will cache and reserve the future that is returned by the delegate the rest of the time.One application of this wrapper is to ensure that prepare() is not called on the underlying response handler more than once per retry no matter where or how many times its invoked.
This class is asserted to be thread-safe and it should be fine to have multiple threads call prepare() simultaneously.
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static <T,R>
IdempotentAsyncResponseHandler<T,R>create(TransformingAsyncResponseHandler<T> wrappedHandler, Supplier<R> preparedScopeSupplier, BiPredicate<R,R> scopeInRangePredicate)Creates a new wrappedTransformingAsyncResponseHandlervoidonError(Throwable error)voidonHeaders(SdkHttpResponse headers)voidonStream(org.reactivestreams.Publisher<ByteBuffer> stream)CompletableFuture<T>prepare()Return the future holding the transformed response.
-
-
-
Method Detail
-
create
public static <T,R> IdempotentAsyncResponseHandler<T,R> create(TransformingAsyncResponseHandler<T> wrappedHandler, Supplier<R> preparedScopeSupplier, BiPredicate<R,R> scopeInRangePredicate)
Creates a new wrappedTransformingAsyncResponseHandler- Type Parameters:
T- The type of the wrappedTransformingAsyncResponseHandlerR- The type of the object used to determine scope.- Parameters:
wrappedHandler- A different handler to wrap.preparedScopeSupplier- A function that retrieves the current scope to determine if a new future can be prepared.scopeInRangePredicate- A predicate that can be used to test the cached scope against the newly retrieved scope to determine if a new future can be prepared.
-
prepare
public CompletableFuture<T> prepare()
Description copied from interface:TransformingAsyncResponseHandlerReturn the future holding the transformed response.This method is guaranteed to be called before the request is executed, and before
SdkAsyncHttpResponseHandler.onHeaders(software.amazon.awssdk.http.SdkHttpResponse)is signaled.- Specified by:
preparein interfaceTransformingAsyncResponseHandler<T>- Returns:
- The future holding the transformed response.
-
onHeaders
public void onHeaders(SdkHttpResponse headers)
- Specified by:
onHeadersin interfaceSdkAsyncHttpResponseHandler
-
onStream
public void onStream(org.reactivestreams.Publisher<ByteBuffer> stream)
- Specified by:
onStreamin interfaceSdkAsyncHttpResponseHandler
-
onError
public void onError(Throwable error)
- Specified by:
onErrorin interfaceSdkAsyncHttpResponseHandler
-
-