Creating Uni and Multi using emitters

Learn how to use integrate with callback based API.

Mutiny provides ways to create Multi and Uni instances where you control when you emit the different events. It is handy when integrating asynchronous APIs using callbacks or listeners. In this case, you can create Unis or Multis by using emitters:

Uni<String> uni = Uni.createFrom().emitter(emitter -> {
    client.execute(ar -> {
        if (ar.failed()) {
            emitter.fail(ar.cause());
        } else {
            emitter.complete(ar.value());
        }
    });
});

Multi<String> multi = Multi.createFrom().emitter(emitter -> {
    client.onMessage(e -> {
        if (e != null) {
            emitter.emit(e);
        } else {
            emitter.complete();
        }
    });
});

The consumer receives the emitter, which is used to emit items, completion, and failure events. The emission can happen from different threads.

The consumer is called for every subscription.

When receiving the emitter, you can register a callback invoked on (downstream) cancellation, failure, and completion. Such a callback lets you clean up resources.

Uni<String> uni = Uni.createFrom().emitter(emitter -> {
    emitter.onTermination(() -> {
        // Called after failure, completion and cancellation
        client.close();
    });
    client.execute(ar -> {
        if (ar.failed()) {
            emitter.fail(ar.cause());
        } else {
            emitter.complete(ar.value());
        }
    });
});