### Install and Sync Dependencies with uv
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/README.md
Installs Python, creates a virtual environment, and synchronizes all development dependencies using the 'uv' tool. This is the initial setup step for the project.
```shell
uv python install
uv venv
source .venv/bin/activate
uv sync --all-extras --dev
```
--------------------------------
### Serve MkDocs Website Locally
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/README.md
Starts the MkDocs development server to preview the project's documentation website. This command should be run from the 'documentation/' directory.
```shell
uv run mkdocs serve
```
--------------------------------
### Add Mutiny to Quarkus project
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/getting-mutiny.md
Demonstrates how to add the Mutiny extension to a Quarkus project using the command-line interface or by manually updating the project's POM file.
```bash
mvn quarkus:add-extension -Dextensions=mutiny
```
```xml
io.quarkusquarkus-mutiny
```
--------------------------------
### Join Multiple Unis with Various Strategies (Java)
Source: https://context7.com/smallrye/smallrye-mutiny/llms.txt
Illustrates different ways to join multiple Uni objects using `Uni.join()`. Strategies include collecting all results (even failures), failing fast if any Uni fails, or selecting the first Uni to complete. It also shows how to get the first Uni that emits an item, ignoring failures until all have failed.
```java
import io.smallrye.mutiny.Uni;
import java.util.List;
Uni a = Uni.createFrom().item(1);
Uni b = Uni.createFrom().item(2);
Uni c = Uni.createFrom().item(3);
// Join all and collect (waits for all, collects failures)
Uni> allResults = Uni.join().all(a, b, c).andCollectFailures();
System.out.println(allResults.await().indefinitely()); // Output: [1, 2, 3]
// Join all with fail-fast (fails immediately if any fails)
Uni> failFast = Uni.join().all(a, b, c).andFailFast();
// Get first to complete
Uni firstToComplete = Uni.join().first(a, b, c).toTerminate();
// Get first to emit a value (ignores failures until all fail)
Uni firstWithValue = Uni.join().first(a, b, c).withItem();
```
--------------------------------
### Java Example: Comparing Uni and Multi Usage
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/reference/uni-and-multi.md
This Java code snippet demonstrates the usage of Uni and Multi reactive types in SmallRye Mutiny. It illustrates how to create, subscribe to, and handle events from both types, highlighting their asynchronous nature and distinct event handling mechanisms.
```java
import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import static org.junit.jupiter.api.Assertions.*;
public class UniMultiComparisonTest {
@Test
public void testUni() {
Uni uni = Uni.createFrom().item("Hello");
AtomicReference result = new AtomicReference<>();
uni.subscribe().with(result::set, failure -> fail("Unexpected failure"));
assertEquals("Hello", result.get());
}
@Test
public void testMulti() {
List items = Arrays.asList("A", "B", "C");
Multi multi = Multi.createFrom().iterable(items);
List collectedItems = multi.collect().asList().await().indefinitely();
assertEquals(items, collectedItems);
}
@Test
public void testUniFailure() {
Uni uni = Uni.createFrom().failure(new RuntimeException("Test failure"));
AtomicReference failure = new AtomicReference<>();
uni.subscribe().with(success -> fail("Unexpected success"), failure::set);
assertNotNull(failure.get());
assertEquals("Test failure", failure.get().getMessage());
}
@Test
public void testMultiCompletion() {
Multi multi = Multi.createFrom().empty()
.onCompletion().fail().with(new IllegalStateException("Expected completion"));
AtomicReference failure = new AtomicReference<>();
multi.subscribe().with(success -> fail("Unexpected success"), failure::set);
assertNotNull(failure.get());
assertEquals("Expected completion", failure.get().getMessage());
}
@Test
public void testUniWithNull() {
Uni uniWithNull = Uni.createFrom().item((String) null);
AtomicReference result = new AtomicReference<>();
uniWithNull.subscribe().with(result::set, failure -> fail("Unexpected failure"));
assertNull(result.get());
}
// Multi does not allow nulls according to Reactive Streams spec
// The following would typically result in an error or be disallowed.
// This test is illustrative of the constraint.
@Test
public void testMultiNullConstraint() {
// Attempting to create a Multi with null would usually be an error
// For demonstration, we'll show a Multi that emits non-nulls and completes.
Multi multi = Multi.createFrom().items("A", "B");
List collected = multi.collect().asList().await().indefinitely();
assertEquals(Arrays.asList("A", "B"), collected);
}
}
```
--------------------------------
### Java: Transform Item to Multi (Duplicate)
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/transforming-items-asynchronously.md
Shows how to transform a single item from a Uni into a Multi, effectively creating a stream from a single value. This example duplicates the incoming item to create a Multi emitting two identical items.
```java
Uni.createFrom().item("hello")
.onItem().transformToMulti(item -> Multi.createFrom().items(item, item))
.subscribe().with(result -> System.out.println("Received: " + result));
```
--------------------------------
### Suspicious reactive method implementation
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/reference/going-reactive-a-few-pitfalls.md
An example of a method returning a Uni that lacks actual asynchronous I/O, highlighting a common anti-pattern in reactive library usage.
```java
public Uni getSuspiciousData() {
return Uni.createFrom().item("data");
}
```
--------------------------------
### Implement Fallback Strategies for Timeouts
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/guides/handling-timeouts.md
Provides examples of using fallback mechanisms when a timeout occurs, allowing the developer to return a default item or switch to an alternative Uni.
```java
// Fallback to a static item
uni.ifNoItem().after(Duration.ofSeconds(1)).recoverWithItem("default");
// Fallback to another Uni
uni.ifNoItem().after(Duration.ofSeconds(1)).recoverWithUni(otherUni);
```
--------------------------------
### Retry failed operations with backoff and deadlines
Source: https://context7.com/smallrye/smallrye-mutiny/llms.txt
Shows how to implement automatic retries for failed operations. Includes examples of simple retry counts, exponential backoff with jitter, and time-based expiration.
```java
import io.smallrye.mutiny.Uni;
import java.time.Duration;
// Simple retry with max attempts
Uni withRetry = Uni.createFrom().item(() -> "Success")
.onFailure().retry().atMost(5);
// Retry with exponential backoff
Uni withBackoff = Uni.createFrom()
.failure(new RuntimeException("Temporary error"))
.onFailure().retry()
.withBackOff(Duration.ofMillis(100), Duration.ofSeconds(1))
.withJitter(0.2)
.atMost(5);
// Retry with deadline
Uni withDeadline = Uni.createFrom()
.failure(new RuntimeException("Error"))
.onFailure().retry()
.withBackOff(Duration.ofMillis(100))
.expireIn(5000);
```
--------------------------------
### Java: Transform Item to Multi (Conditional)
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/transforming-items-asynchronously.md
Demonstrates transforming a Uni item into a Multi based on a condition. This example creates a Multi that emits the item twice if it's not null, otherwise, it emits nothing.
```java
Uni.createFrom().optional(Optional.of("hello"))
.onItem().transformToMulti(optional -> optional.isPresent() ? Multi.createFrom().items(optional.get(), optional.get()) : Multi.createFrom().empty())
.subscribe().with(result -> System.out.println("Received: " + result));
```
--------------------------------
### Process Multi as Kotlin Flow
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/guides/kotlin.md
This example shows how to process a Mutiny Multi as a Kotlin Flow. While Kotlin's Flow lacks full reactive streams flow control, this conversion allows for coroutine-based consumption of Multi items, with configurable buffering.
```kotlin
{{ insert('kotlin/guides/Coroutines.kt', 'multiAsFlow') }}
```
--------------------------------
### Create and Subscribe to a Uni in Java
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/hello-mutiny.md
This Java code snippet demonstrates the creation of a Mutiny Uni that emits a single string item. It then applies transformations (appending ' mutiny' and converting to uppercase) to this item within a processing pipeline. Finally, it subscribes to the pipeline to consume the processed item and print it to the console. This illustrates the basic reactive programming pattern in Mutiny.
```java
import io.smallrye.mutiny.Uni;
public class FirstProgram {
public static void main(String[] args) {
Uni.createFrom().item("hello")
.onItem().apply(s -> s + " mutiny")
.onItem().apply(String::toUpperCase)
.subscribe().with(System.out::println);
}
}
```
--------------------------------
### Add Vert.x Mutiny bindings dependency
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/getting-mutiny.md
Configures dependencies for SmallRye Mutiny Vert.x bindings, allowing the use of Mutiny with Eclipse Vert.x modules. Supports Maven, Gradle, and JBang build environments.
```xml
io.smallrye.reactivesmallrye-mutiny-vertx-core{{ attributes.versions.vertx_bindings }}
```
```groovy
implementation 'io.smallrye.reactive:smallrye-mutiny-vertx-core:{{ attributes.versions.vertx_bindings }}'
```
```kotlin
implementation("io.smallrye.reactive:smallrye-mutiny-vertx-core:{{ attributes.versions.vertx_bindings }}")
```
```java
//DEPS io.smallrye.reactive:smallrye-mutiny-vertx-core:{{ attributes.versions.vertx_bindings }}
```
--------------------------------
### Add Mutiny dependency to project
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/getting-mutiny.md
Configures the core Mutiny library dependency for various build tools including Maven, Gradle (Groovy/Kotlin), and JBang. This is the primary step to enable reactive programming features in a Java application.
```xml
io.smallrye.reactivemutiny{{ attributes.versions.mutiny }}
```
```groovy
implementation 'io.smallrye.reactive:mutiny:{{ attributes.versions.mutiny }}'
```
```kotlin
implementation("io.smallrye.reactive:mutiny:{{ attributes.versions.mutiny }}")
```
```java
//DEPS io.smallrye.reactive:mutiny:{{ attributes.versions.mutiny }}
```
--------------------------------
### Mutiny Uni Pipeline Construction in Java
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/hello-mutiny.md
This Java code snippet illustrates the builder API pattern used in Mutiny for constructing Uni pipelines. It shows how appending stages like `onItem().apply()` returns a new Uni instance, and how chaining these operations builds the processing pipeline. It also highlights a common pitfall where intermediate Unis are subscribed to, bypassing subsequent transformations.
```java
import io.smallrye.mutiny.Uni;
public class FirstProgramTest {
public static void main(String[] args) {
// Equivalent to the first program
Uni uni = Uni.createFrom().item("hello")
.onItem().apply(s -> s + " mutiny")
.onItem().apply(String::toUpperCase);
uni.subscribe().with(System.out::println);
// This program prints only ">> hello"
Uni uni2 = Uni.createFrom().item("hello");
uni2.subscribe().with(System.out::println);
}
}
```
--------------------------------
### Mutiny Rx Equivalents and Usage in Java
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/guides/rx.md
Demonstrates the Mutiny equivalents for RxJava's map, flatMap, and concatMap methods. It shows how to use `onItem().transform()`, `onItem().transformToUniAndMerge()`, `onItem().transformToMultiAndMerge()`, `onItem().transformToUniAndConcatenate()`, and `onItem().transformToMultiAndConcatenate()` in Java.
```java
import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class RxTest {
@Test
public void rx() {
List list = Arrays.asList(1, 2, 3);
// map equivalent
Multi.createFrom().iterable(list)
.onItem().transform(i -> i * 2)
.subscribe().with(i -> System.out.println("Map: " + i));
// flatMap equivalent (Uni)
Multi.createFrom().iterable(list)
.onItem().transformToUniAndMerge(i -> Uni.createFrom().item(i * 2))
.subscribe().with(i -> System.out.println("FlatMap Uni: " + i));
// flatMap equivalent (Multi)
Multi.createFrom().iterable(list)
.onItem().transformToMultiAndMerge(i -> Multi.createFrom().items(i, i + 1))
.subscribe().with(i -> System.out.println("FlatMap Multi: " + i));
// concatMap equivalent (Uni)
Multi.createFrom().iterable(list)
.onItem().transformToUniAndConcatenate(i -> Uni.createFrom().item(i * 2))
.subscribe().with(i -> System.out.println("ConcatMap Uni: " + i));
// concatMap equivalent (Multi)
Multi.createFrom().iterable(list)
.onItem().transformToMultiAndConcatenate(i -> Multi.createFrom().items(i, i + 1))
.subscribe().with(i -> System.out.println("ConcatMap Multi: " + i));
}
// Example demonstrating the difference between flatMap and concatMap
@Test
public void mutiny() {
AtomicInteger counter = new AtomicInteger(0);
// flatMap (unordered execution)
Multi.createFrom().range(1, 4) // Numbers 1, 2, 3
.onItem().transformToUniAndMerge(i -> Uni.createFrom().item(i).onItem().delayIt().bySeconds(4 - i))
.subscribe().with(System.out::println);
// concatMap (ordered execution)
Multi.createFrom().range(1, 4) // Numbers 1, 2, 3
.onItem().transformToUniAndConcatenate(i -> Uni.createFrom().item(i).onItem().delayIt().bySeconds(4 - i))
.subscribe().with(System.out::println);
// Wait for operations to complete (in a real app, you'd use await().indefinitely() or similar)
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
```
--------------------------------
### Transforming Uni items
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/transforming-items.md
Demonstrates how to transform a single item emitted by a Uni using the onItem().transform() method. This example shows capitalizing a string value.
```java
Uni uni = Uni.createFrom().item("hello");
Uni transformed = uni.onItem().transform(String::toUpperCase);
```
--------------------------------
### Add Mutiny Kotlin Dependency for Maven
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/guides/kotlin.md
This snippet shows how to add the mutiny-kotlin dependency to your Maven project. Ensure you use the correct version matching your Mutiny installation.
```xml
io.smallrye.reactivemutiny-kotlin{{ attributes.versions.mutiny }}
```
--------------------------------
### Create Uni from CompletionStage
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/guides/completion-stage.md
Shows how to wrap a CompletionStage into a Uni. Using a Supplier is recommended to ensure the operation is deferred until subscription and can be re-triggered.
```java
Uni uni = Uni.createFrom().completionStage(() -> getCompletionStage());
```
--------------------------------
### Create Uni
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/creating-uni-pipelines.md
Shows how to represent an operation that completes successfully without returning a value by emitting null.
```java
Uni voidUni = Uni.createFrom().nullItem();
```
--------------------------------
### Create failing and empty Multi streams
Source: https://github.com/smallrye/smallrye-mutiny/blob/main/documentation/docs/tutorials/creating-multi-pipelines.md
Demonstrates how to initialize streams that immediately emit a failure or complete without items.
```java
// Failing
Multi