All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.smallrye.reactive.messaging.providers.locals.LocalContextMetadata Maven / Gradle / Ivy

package io.smallrye.reactive.messaging.providers.locals;

import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Function;

import org.eclipse.microprofile.reactive.messaging.Message;

import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.subscription.UniEmitter;
import io.smallrye.reactive.messaging.providers.helpers.VertxContext;
import io.vertx.core.Context;

public class LocalContextMetadata {

    private final Context context;

    public LocalContextMetadata(Context context) {
        this.context = context;
    }

    public Context context() {
        return context;
    }

    // TODO Flatten identity transformation (onItem().transformToUni(u -> u)))
    // TODO Use operators instead of emitter

    // TODO Replace with an operator
    public static  Uni invokeOnMessageContext(Message incoming, Function, T> function) {
        return invokeOnMessageContext(incoming, (message, emitter) -> {
            T res;
            try {
                res = function.apply(message);
            } catch (Exception failure) {
                emitter.fail(failure);
                return;
            }
            emitter.complete(res);
        });
    }

    public static  Uni invokeOnMessageContext(Message incoming,
            BiConsumer, UniEmitter> function) {
        Optional metadata = incoming != null ? incoming.getMetadata().get(LocalContextMetadata.class)
                : Optional.empty();
        if (metadata.isPresent()) {
            // Call function on Message's context
            // TODO Replace with an operator
            return Uni.createFrom().emitter(emitter -> {
                VertxContext.runOnContext(metadata.get().context, () -> {
                    try {
                        function.accept(incoming, emitter);
                    } catch (Exception e) {
                        emitter.fail(e);
                    }
                });

            });
        } else {
            return Uni.createFrom().emitter(emitter -> function.accept(incoming, emitter));
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy