Class BeforeFinallyHttpOperator

  • All Implemented Interfaces:
    SingleOperator<StreamingHttpResponse,​StreamingHttpResponse>, java.util.function.Function<SingleSource.Subscriber<? super StreamingHttpResponse>,​SingleSource.Subscriber<? super StreamingHttpResponse>>

    public final class BeforeFinallyHttpOperator
    extends java.lang.Object
    implements SingleOperator<StreamingHttpResponse,​StreamingHttpResponse>
    Helper operator for signaling the end of an HTTP Request/Response cycle.

    StreamingHttpRequest and StreamingHttpResponse are nested sources (Single of meta-data containing a payload Publisher), which makes it non-trivial to get a single signal at the end of this Request/Response cycle. One needs to consider and coordinate between the multitude of outcomes: cancel/success/error across both sources.

    This operator ensures that the provided callback is triggered just once whenever the sources reach a terminal state across both sources.

    Example usage tracking the begin and end of a request:
         // coarse grained, any terminal signal calls the provided `Runnable`
         return requester.request(strategy, request)
                         .beforeOnSubscribe(__ -> tracker.requestStarted())
                         .liftSync(new BeforeFinallyHttpOperator(tracker::requestFinished));
         // fine grained, `tracker` implements `TerminalSignalConsumer`, terminal signal indicated by the callback method
         return requester.request(strategy, request)
                         .beforeOnSubscribe(__ -> tracker.requestStarted())
                         .liftSync(new BeforeFinallyHttpOperator(tracker));