Search in sources :

Example 1 with EmissionException

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

the class NextProcessor method emitEmpty.

void emitEmpty(Sinks.EmitFailureHandler failureHandler) {
    for (; ; ) {
        Sinks.EmitResult emitResult = tryEmitValue(null);
        if (emitResult.isSuccess()) {
            return;
        }
        boolean shouldRetry = failureHandler.onEmitFailure(SignalType.ON_COMPLETE, emitResult);
        if (shouldRetry) {
            continue;
        }
        switch(emitResult) {
            case FAIL_ZERO_SUBSCRIBER:
            case FAIL_OVERFLOW:
            case FAIL_CANCELLED:
            case FAIL_TERMINATED:
                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 2 with EmissionException

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

the class InternalOneSinkTest method shouldDelegateToHandler.

@ParameterizedTestWithName
@EnumSource(value = Sinks.EmitResult.class)
void shouldDelegateToHandler(EmitResult emitResult) {
    assumeThat(emitResult.isFailure()).isTrue();
    Sinks.One<Object> sink = new InternalOneSinkAdapter<Object>() {

        @Override
        public Sinks.EmitResult tryEmitValue(Object value) {
            return emitResult;
        }

        @Override
        public Sinks.EmitResult tryEmitError(Throwable error) {
            return emitResult;
        }

        @Override
        public Sinks.EmitResult tryEmitEmpty() {
            return emitResult;
        }
    };
    for (SignalType signalType : new SignalType[] { SignalType.ON_NEXT, SignalType.ON_ERROR, SignalType.ON_COMPLETE }) {
        AtomicReference<Sinks.EmitResult> emissionRef = new AtomicReference<>();
        try {
            EmitFailureHandler handler = (failedSignalType, failedEmission) -> {
                emissionRef.set(failedEmission);
                return false;
            };
            switch(signalType) {
                case ON_NEXT:
                    sink.emitValue("Hello", handler);
                    break;
                case ON_ERROR:
                    sink.emitError(new Exception("boom"), handler);
                    break;
                case ON_COMPLETE:
                    sink.emitEmpty(handler);
                    break;
                default:
                    throw new IllegalStateException();
            }
        } catch (EmissionException e) {
            assertThat(e.getReason()).isEqualTo(Sinks.EmitResult.FAIL_NON_SERIALIZED);
        }
        assertThat(emissionRef).as("emitResult").hasValue(emitResult);
    }
}
Also used : ParameterizedTestWithName(reactor.test.ParameterizedTestWithName) Assumptions.assumeThat(org.assertj.core.api.Assumptions.assumeThat) Context(reactor.util.context.Context) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) EnumSource(org.junit.jupiter.params.provider.EnumSource) AtomicReference(java.util.concurrent.atomic.AtomicReference) Test(org.junit.jupiter.api.Test) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) EmissionException(reactor.core.publisher.Sinks.EmissionException) Assertions.assertThatExceptionOfType(org.assertj.core.api.Assertions.assertThatExceptionOfType) EmitResult(reactor.core.publisher.Sinks.EmitResult) EmitFailureHandler(reactor.core.publisher.Sinks.EmitFailureHandler) Exceptions(reactor.core.Exceptions) AtomicReference(java.util.concurrent.atomic.AtomicReference) EmissionException(reactor.core.publisher.Sinks.EmissionException) EmitFailureHandler(reactor.core.publisher.Sinks.EmitFailureHandler) EmitResult(reactor.core.publisher.Sinks.EmitResult) EmissionException(reactor.core.publisher.Sinks.EmissionException) EnumSource(org.junit.jupiter.params.provider.EnumSource) ParameterizedTestWithName(reactor.test.ParameterizedTestWithName)

Example 3 with EmissionException

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

the class InternalManySinkTest method shouldDelegateToHandler.

@ParameterizedTestWithName
@EnumSource(value = Sinks.EmitResult.class)
void shouldDelegateToHandler(Sinks.EmitResult emitResult) {
    assumeThat(emitResult.isFailure()).isTrue();
    Sinks.Many<Object> sink = new InternalManySinkAdapter<Object>() {

        @Override
        public EmitResult tryEmitNext(Object o) {
            return emitResult;
        }

        @Override
        public Sinks.EmitResult tryEmitError(Throwable error) {
            return emitResult;
        }

        @Override
        public EmitResult tryEmitComplete() {
            return emitResult;
        }
    };
    for (SignalType signalType : new SignalType[] { SignalType.ON_NEXT, SignalType.ON_ERROR, SignalType.ON_COMPLETE }) {
        AtomicReference<EmitResult> emissionRef = new AtomicReference<>();
        try {
            EmitFailureHandler handler = (failedSignalType, failedEmission) -> {
                emissionRef.set(failedEmission);
                return false;
            };
            switch(signalType) {
                case ON_NEXT:
                    sink.emitNext("Hello", handler);
                    break;
                case ON_ERROR:
                    sink.emitError(new Exception("boom"), handler);
                    break;
                case ON_COMPLETE:
                    sink.emitComplete(handler);
                    break;
                default:
                    throw new IllegalStateException();
            }
        } catch (EmissionException e) {
            assertThat(e.getReason()).isEqualTo(EmitResult.FAIL_NON_SERIALIZED);
        }
        assertThat(emissionRef).as("emitResult").hasValue(emitResult);
    }
}
Also used : ParameterizedTestWithName(reactor.test.ParameterizedTestWithName) Assumptions.assumeThat(org.assertj.core.api.Assumptions.assumeThat) Context(reactor.util.context.Context) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) EnumSource(org.junit.jupiter.params.provider.EnumSource) AtomicReference(java.util.concurrent.atomic.AtomicReference) Test(org.junit.jupiter.api.Test) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) EmissionException(reactor.core.publisher.Sinks.EmissionException) Assertions.assertThatExceptionOfType(org.assertj.core.api.Assertions.assertThatExceptionOfType) EmitResult(reactor.core.publisher.Sinks.EmitResult) EmitFailureHandler(reactor.core.publisher.Sinks.EmitFailureHandler) Exceptions(reactor.core.Exceptions) AtomicReference(java.util.concurrent.atomic.AtomicReference) EmissionException(reactor.core.publisher.Sinks.EmissionException) EmitFailureHandler(reactor.core.publisher.Sinks.EmitFailureHandler) EmitResult(reactor.core.publisher.Sinks.EmitResult) EmissionException(reactor.core.publisher.Sinks.EmissionException) EnumSource(org.junit.jupiter.params.provider.EnumSource) ParameterizedTestWithName(reactor.test.ParameterizedTestWithName)

Example 4 with EmissionException

use of reactor.core.publisher.Sinks.EmissionException 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 5 with EmissionException

use of reactor.core.publisher.Sinks.EmissionException 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

EmissionException (reactor.core.publisher.Sinks.EmissionException)5 EmitResult (reactor.core.publisher.Sinks.EmitResult)5 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 AtomicReference (java.util.concurrent.atomic.AtomicReference)2 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 Test (org.junit.jupiter.api.Test)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