Search in sources :

Example 11 with EmitResult

use of reactor.core.publisher.Sinks.EmitResult in project reactor-core by reactor.

the class NextProcessor method onError.

@Override
public final void onError(Throwable cause) {
    for (; ; ) {
        EmitResult emitResult = tryEmitError(cause);
        if (emitResult.isSuccess()) {
            return;
        }
        boolean shouldRetry = EmitFailureHandler.FAIL_FAST.onEmitFailure(SignalType.ON_ERROR, emitResult);
        if (shouldRetry) {
            continue;
        }
        switch(emitResult) {
            case FAIL_ZERO_SUBSCRIBER:
            case FAIL_OVERFLOW:
            case FAIL_CANCELLED:
                return;
            case FAIL_TERMINATED:
                Operators.onErrorDropped(cause, currentContext());
                return;
            case FAIL_NON_SERIALIZED:
                throw new EmissionException(emitResult, "Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially.");
            default:
                throw new EmissionException(emitResult, "Unknown emitResult value");
        }
    }
}
Also used : EmitResult(reactor.core.publisher.Sinks.EmitResult) EmissionException(reactor.core.publisher.Sinks.EmissionException)

Example 12 with EmitResult

use of reactor.core.publisher.Sinks.EmitResult in project reactor-core by reactor.

the class NextProcessor method onNext.

@Override
public final void onNext(@Nullable O value) {
    if (value == null) {
        emitEmpty(EmitFailureHandler.FAIL_FAST);
        return;
    }
    for (; ; ) {
        EmitResult emitResult = tryEmitValue(value);
        if (emitResult.isSuccess()) {
            return;
        }
        boolean shouldRetry = EmitFailureHandler.FAIL_FAST.onEmitFailure(SignalType.ON_NEXT, emitResult);
        if (shouldRetry) {
            continue;
        }
        switch(emitResult) {
            case FAIL_ZERO_SUBSCRIBER:
                // effectively NO-OP cause there's no subscriber, so no context :(
                return;
            case FAIL_OVERFLOW:
                Operators.onDiscard(value, currentContext());
                // the emitError will onErrorDropped if already terminated
                onError(Exceptions.failWithOverflow("Backpressure overflow during Sinks.Many#emitNext"));
                return;
            case FAIL_CANCELLED:
                Operators.onDiscard(value, currentContext());
                return;
            case FAIL_TERMINATED:
                Operators.onNextDropped(value, currentContext());
                return;
            case FAIL_NON_SERIALIZED:
                throw new EmissionException(emitResult, "Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially.");
            default:
                throw new EmissionException(emitResult, "Unknown emitResult value");
        }
    }
}
Also used : EmitResult(reactor.core.publisher.Sinks.EmitResult) EmissionException(reactor.core.publisher.Sinks.EmissionException)

Aggregations

EmitResult (reactor.core.publisher.Sinks.EmitResult)12 Test (org.junit.jupiter.api.Test)9 AtomicReference (java.util.concurrent.atomic.AtomicReference)6 EmissionException (reactor.core.publisher.Sinks.EmissionException)5 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)4 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)2 Assertions.assertThatExceptionOfType (org.assertj.core.api.Assertions.assertThatExceptionOfType)2 Assumptions.assumeThat (org.assertj.core.api.Assumptions.assumeThat)2 EnumSource (org.junit.jupiter.params.provider.EnumSource)2 Exceptions (reactor.core.Exceptions)2 EmitFailureHandler (reactor.core.publisher.Sinks.EmitFailureHandler)2 ParameterizedTestWithName (reactor.test.ParameterizedTestWithName)2 Context (reactor.util.context.Context)2