private void request0(long n) {
        if (obj3 == null) {
            return;
        }

        if (n <= 0) {
            onError(new IllegalArgumentException(
                    "n: " + n + " (expected: > 0, see Reactive Streams specification rule 3.9)"));
            return;
        }

        if (inOnNext) {
            // re-entrance
            if (n == 1) {
                demand++;
            } else {
                demand += 2;
            }
            return;
        }

        if (n >= 3) {
            // All elements will be consumed. No need to restore inOnNext
            inOnNext = true;
            if (obj1 != null) {
                final T item = obj1;
                obj1 = null;
                onNext(item);
            }
            if (obj2 != null) {
                final T item = obj2;
                obj2 = null;
                onNext(item);
            }
            if (obj3 != null) {
                final T item = obj3;
                obj3 = null;
                onNext(item);
                onComplete();
            }
        } else {
            demand += n;
            if (obj1 != null) {
                final T item = obj1;
                obj1 = null;
                inOnNext = true;
                onNext(item);
                inOnNext = false;
                demand--;
            }

            if (obj2 != null && demand > 0) {
                final T item = obj2;
                obj2 = null;
                inOnNext = true;
                onNext(item);
                inOnNext = false;
                demand--;
            }

            if (obj3 != null && demand > 0) {
                final T item = obj3;
                obj3 = null;
                onNext(item);
                onComplete();
            }
        }
    }
Constructs a new {@link ThreeElementFixedStreamMessage} for the given objects.
core/src/main/java/com/linecorp/armeria/internal/common/stream/ThreeElementFixedStreamMessage.java