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();
}
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);
}
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");
}
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");
}
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");
}
Aggregations