code: @CheckReturnValue
      @BackpressureSupport(BackpressureKind.PASS_THROUGH)
      @SchedulerSupport(SchedulerSupport.NONE)
      public final Flowable<T> doOnLifecycle(final Consumer<? super Subscription> onSubscribe,
              final LongConsumer onRequest, final Action onCancel) {
          ObjectHelper.requireNonNull(onSubscribe, "onSubscribe is null");
          ObjectHelper.requireNonNull(onRequest, "onRequest is null");
          ObjectHelper.requireNonNull(onCancel, "onCancel is null");
          return RxJavaPlugins.onAssembly(new FlowableDoOnLifecycle<T>(this, onSubscribe, onRequest, onCancel));
      }
docs: Calls the appropriate onXXX method (shared between all Subscribers) for the lifecycle events of
  the sequence (subscription, cancellation, requesting).
  <p>
  <img width="640" height="310" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/doOnNext.png" alt="">
  <dl>
  <dt><b>Backpressure:</b></dt>
  <dd>The operator doesn't interfere with backpressure which is determined by the source {@code Publisher}'s
  backpressure behavior.</dd>
  <dt><b>Scheduler:</b></dt>
  <dd>{@code doOnLifecycle} does not operate by default on a particular {@link Scheduler}.</dd>
  </dl>
  
  @param onSubscribe
  a Consumer called with the Subscription sent via Subscriber.onSubscribe()
  @param onRequest
  a LongConsumer called with the request amount sent via Subscription.request()
  @param onCancel
  called when the downstream cancels the Subscription via cancel()
  @return the source Publisher with the side-effecting behavior applied
  @see <a href="http://reactivex.io/documentation/operators/do.html">ReactiveX operators documentation: Do</a>