Class IdempotentAsyncResponseHandler<T,​R>

  • Type Parameters:
    T - The type of the wrapped TransformingAsyncResponseHandler
    R - The type of the object used to determine scope.
    All Implemented Interfaces:
    TransformingAsyncResponseHandler<T>, software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler

    @ThreadSafe
    public class IdempotentAsyncResponseHandler<T,​R>
    extends Object
    implements TransformingAsyncResponseHandler<T>
    Wrapper for a TransformingAsyncResponseHandler that 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 Detail

      • create

        public static <T,​R> IdempotentAsyncResponseHandler<T,​R> create​(TransformingAsyncResponseHandler<T> wrappedHandler,
                                                                                   Supplier<R> preparedScopeSupplier,
                                                                                   BiPredicate<R,​R> scopeInRangePredicate)
        Creates a new wrapped TransformingAsyncResponseHandler
        Type Parameters:
        T - The type of the wrapped TransformingAsyncResponseHandler
        R - 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: TransformingAsyncResponseHandler
        Return 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:
        prepare in interface TransformingAsyncResponseHandler<T>
        Returns:
        The future holding the transformed response.
      • onHeaders

        public void onHeaders​(software.amazon.awssdk.http.SdkHttpResponse headers)
        Specified by:
        onHeaders in interface software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler
      • onStream

        public void onStream​(org.reactivestreams.Publisher<ByteBuffer> stream)
        Specified by:
        onStream in interface software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler
      • onError

        public void onError​(Throwable error)
        Specified by:
        onError in interface software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler