Search in sources :

Example 11 with Multi

use of io.smallrye.mutiny.Multi in project smallrye-mutiny by smallrye.

the class ExponentialBackoff method randomExponentialBackoffFunctionExpireAt.

/**
 * Computes a method that would delay <em>ticks</em> using an exponential backoff.
 * Will keep retrying until an expiration time.
 * The last attempt will start before the expiration time.
 *
 * @param expireAt absolute time in millis that specifies when to give up.
 * @param firstBackoff the delay of the first backoff
 * @param maxBackoff the max backoff
 * @param jitterFactor the jitter factor in [0, 1]
 * @param executor the executor used for the delay
 * @return the function
 */
public static Function<Multi<Throwable>, Publisher<Long>> randomExponentialBackoffFunctionExpireAt(long expireAt, Duration firstBackoff, Duration maxBackoff, double jitterFactor, ScheduledExecutorService executor) {
    validate(firstBackoff, maxBackoff, jitterFactor, executor);
    AtomicInteger index = new AtomicInteger();
    return t -> t.onItem().transformToUni(failure -> {
        int iteration = index.incrementAndGet();
        Duration delay = getNextDelay(firstBackoff, maxBackoff, jitterFactor, iteration);
        long checkTime = System.currentTimeMillis() + delay.toMillis();
        if (checkTime > expireAt) {
            return Uni.createFrom().failure(new IllegalStateException("Retries exhausted : " + iteration + " attempts against " + checkTime + "/" + expireAt + " expiration", failure));
        }
        return Uni.createFrom().item((long) iteration).onItem().delayIt().onExecutor(executor).by(delay);
    }).concatenate();
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Publisher(org.reactivestreams.Publisher) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Function(java.util.function.Function) Multi(io.smallrye.mutiny.Multi) Uni(io.smallrye.mutiny.Uni) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration)

Example 12 with Multi

use of io.smallrye.mutiny.Multi in project smallrye-mutiny by smallrye.

the class MultiOnEventTest method testFailureInAsyncCallback.

@Test
public void testFailureInAsyncCallback() {
    AtomicInteger res = new AtomicInteger();
    Multi<Integer> more = Multi.createFrom().items(1, 2, 3);
    assertThatThrownBy(() -> more.onItem().call(i -> {
        res.set(i);
        if (i == 2) {
            throw new RuntimeException("boom");
        }
        return Uni.createFrom().nullItem();
    }).collect().asList().await().indefinitely()).isInstanceOf(RuntimeException.class).hasMessageContaining("boom");
    assertThat(res).hasValue(2);
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) AssertSubscriber(io.smallrye.mutiny.helpers.test.AssertSubscriber) BroadcastProcessor(io.smallrye.mutiny.operators.multi.processors.BroadcastProcessor) Predicate(java.util.function.Predicate) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) IOException(java.io.IOException) CompletionException(java.util.concurrent.CompletionException) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) Multi(io.smallrye.mutiny.Multi) Uni(io.smallrye.mutiny.Uni) Consumer(java.util.function.Consumer) Test(org.junit.jupiter.api.Test) AtomicLong(java.util.concurrent.atomic.AtomicLong) CompositeException(io.smallrye.mutiny.CompositeException) List(java.util.List) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Subscription(org.reactivestreams.Subscription) Cancellable(io.smallrye.mutiny.subscription.Cancellable) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Test(org.junit.jupiter.api.Test)

Example 13 with Multi

use of io.smallrye.mutiny.Multi in project smallrye-mutiny by smallrye.

the class MultiCacheTest method testCachingWithFailure.

@Test
public void testCachingWithFailure() {
    AtomicInteger count = new AtomicInteger();
    Multi<Integer> multi = Multi.createFrom().<Integer>emitter(emitter -> emitter.emit(count.incrementAndGet()).emit(count.incrementAndGet()).fail(new IOException("boom-" + count.incrementAndGet()))).cache();
    multi.subscribe().withSubscriber(AssertSubscriber.create(2)).assertItems(1, 2).assertFailedWith(IOException.class, "boom-3");
    multi.subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)).assertItems(1, 2).assertFailedWith(IOException.class, "boom-3");
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Test(org.junit.jupiter.api.Test) AssertSubscriber(io.smallrye.mutiny.helpers.test.AssertSubscriber) MultiEmitter(io.smallrye.mutiny.subscription.MultiEmitter) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) IOException(java.io.IOException) AtomicReference(java.util.concurrent.atomic.AtomicReference) Multi(io.smallrye.mutiny.Multi) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) IOException(java.io.IOException) Test(org.junit.jupiter.api.Test)

Example 14 with Multi

use of io.smallrye.mutiny.Multi in project smallrye-mutiny by smallrye.

the class MultiCombineTest method testCombineLatestWithFailingStreamAndFailureCollection.

@Test
public void testCombineLatestWithFailingStreamAndFailureCollection() {
    Multi<Integer> stream = Multi.createFrom().failure(new IOException("boomA"));
    Multi<Integer> stream2 = Multi.createFrom().failure(new IOException("boomB"));
    Multi.createBy().combining().streams(stream, Multi.createFrom().nothing(), stream2).latestItems().collectFailures().using((a, b, c) -> null).subscribe().withSubscriber(AssertSubscriber.create(4)).assertFailedWith(IOException.class, "boomA");
}
Also used : Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) AssertSubscriber(io.smallrye.mutiny.helpers.test.AssertSubscriber) Arrays(java.util.Arrays) io.smallrye.mutiny.tuples(io.smallrye.mutiny.tuples) MultiEmitter(io.smallrye.mutiny.subscription.MultiEmitter) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) BiFunction(java.util.function.BiFunction) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) IOException(java.io.IOException) CompletionException(java.util.concurrent.CompletionException) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) Multi(io.smallrye.mutiny.Multi) Test(org.junit.jupiter.api.Test) List(java.util.List) Assertions.assertThatExceptionOfType(org.assertj.core.api.Assertions.assertThatExceptionOfType) Spy(io.smallrye.mutiny.helpers.spies.Spy) Collections(java.util.Collections) MultiOnCancellationSpy(io.smallrye.mutiny.helpers.spies.MultiOnCancellationSpy) IOException(java.io.IOException) Test(org.junit.jupiter.api.Test)

Example 15 with Multi

use of io.smallrye.mutiny.Multi in project smallrye-mutiny by smallrye.

the class MultiCombineTest method testCombineLatestWithFailingStream.

@Test
public void testCombineLatestWithFailingStream() {
    Multi<Integer> stream = Multi.createFrom().failure(new IOException("boom"));
    Multi.createBy().combining().streams(stream, Multi.createFrom().nothing()).latestItems().using((a, b) -> null).subscribe().withSubscriber(AssertSubscriber.create(4)).assertFailedWith(IOException.class, "boom");
}
Also used : Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) AssertSubscriber(io.smallrye.mutiny.helpers.test.AssertSubscriber) Arrays(java.util.Arrays) io.smallrye.mutiny.tuples(io.smallrye.mutiny.tuples) MultiEmitter(io.smallrye.mutiny.subscription.MultiEmitter) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) BiFunction(java.util.function.BiFunction) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) IOException(java.io.IOException) CompletionException(java.util.concurrent.CompletionException) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) Multi(io.smallrye.mutiny.Multi) Test(org.junit.jupiter.api.Test) List(java.util.List) Assertions.assertThatExceptionOfType(org.assertj.core.api.Assertions.assertThatExceptionOfType) Spy(io.smallrye.mutiny.helpers.spies.Spy) Collections(java.util.Collections) MultiOnCancellationSpy(io.smallrye.mutiny.helpers.spies.MultiOnCancellationSpy) IOException(java.io.IOException) Test(org.junit.jupiter.api.Test)

Aggregations

Multi (io.smallrye.mutiny.Multi)75 Uni (io.smallrye.mutiny.Uni)52 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)51 Test (org.junit.jupiter.api.Test)45 AssertSubscriber (io.smallrye.mutiny.helpers.test.AssertSubscriber)43 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)42 List (java.util.List)38 IOException (java.io.IOException)34 Duration (java.time.Duration)31 Assertions.assertThrows (org.junit.jupiter.api.Assertions.assertThrows)31 Function (java.util.function.Function)30 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)28 AtomicReference (java.util.concurrent.atomic.AtomicReference)26 Consumer (java.util.function.Consumer)26 InfrastructureResource (junit5.support.InfrastructureResource)22 ResourceAccessMode (org.junit.jupiter.api.parallel.ResourceAccessMode)22 ResourceLock (org.junit.jupiter.api.parallel.ResourceLock)22 Supplier (java.util.function.Supplier)21 ArrayList (java.util.ArrayList)20 CompositeException (io.smallrye.mutiny.CompositeException)19