Search in sources :

Example 11 with Uni

use of io.smallrye.mutiny.Uni in project hibernate-reactive by hibernate.

the class MultipleContextTest method testFindWithMutiny.

@Test
public void testFindWithMutiny(TestContext testContext) {
    final Async async = testContext.async();
    Uni<Mutiny.Session> sessionUni = getMutinySessionFactory().openSession();
    currentSession = sessionUni;
    Context testVertxContext = Vertx.currentContext();
    // Create a different new context
    Context newContext = Vertx.vertx().getOrCreateContext();
    Assertions.assertThat(testVertxContext).isNotEqualTo(newContext);
    test(testContext, sessionUni.invoke(session -> {
        // Run test in the new context
        newContext.runOnContext(event -> test(async, testContext, session.find(Competition.class, "Chess boxing").onItemOrFailure().transformToUni((unused, e) -> Uni.createFrom().completionStage(assertExceptionThrown(e)))));
    }));
}
Also used : TestContext(io.vertx.ext.unit.TestContext) Context(io.vertx.core.Context) Mutiny(org.hibernate.reactive.mutiny.Mutiny) TestContext(io.vertx.ext.unit.TestContext) DatabaseSelectionRule.runOnlyFor(org.hibernate.reactive.testing.DatabaseSelectionRule.runOnlyFor) Entity(javax.persistence.Entity) Async(io.vertx.ext.unit.Async) Vertx(io.vertx.core.Vertx) CompletableFuture(java.util.concurrent.CompletableFuture) Test(org.junit.Test) DatabaseSelectionRule(org.hibernate.reactive.testing.DatabaseSelectionRule) Context(io.vertx.core.Context) Uni(io.smallrye.mutiny.Uni) Stage(org.hibernate.reactive.stage.Stage) CompletionStage(java.util.concurrent.CompletionStage) Rule(org.junit.Rule) Ignore(org.junit.Ignore) POSTGRESQL(org.hibernate.reactive.containers.DatabaseConfiguration.DBType.POSTGRESQL) Locale(java.util.Locale) After(org.junit.After) Assertions(org.assertj.core.api.Assertions) Configuration(org.hibernate.cfg.Configuration) Id(javax.persistence.Id) Async(io.vertx.ext.unit.Async) Test(org.junit.Test)

Example 12 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.

the class AbstractMediator method invokeBlocking.

@SuppressWarnings("unchecked")
protected <T> Uni<T> invokeBlocking(Message<?> message, Object... args) {
    try {
        Optional<LocalContextMetadata> metadata = message != null ? message.getMetadata().get(LocalContextMetadata.class) : Optional.empty();
        Context currentContext = metadata.map(m -> Context.newInstance(m.context())).orElseGet(Vertx::currentContext);
        return workerPoolRegistry.executeWork(currentContext, Uni.createFrom().emitter(emitter -> {
            try {
                Object result = this.invoker.invoke(args);
                if (result instanceof CompletionStage) {
                    ((CompletionStage<?>) result).thenAccept(x -> emitter.complete((T) x));
                } else {
                    emitter.complete((T) result);
                }
            } catch (RuntimeException e) {
                log.methodException(configuration().methodAsString(), e);
                emitter.fail(e);
            }
        }), configuration.getWorkerPoolName(), configuration.isBlockingExecutionOrdered());
    } catch (RuntimeException e) {
        log.methodException(configuration().methodAsString(), e);
        throw e;
    }
}
Also used : Context(io.vertx.mutiny.core.Context) WorkerPoolRegistry(io.smallrye.reactive.messaging.providers.connectors.WorkerPoolRegistry) Acknowledgment(org.eclipse.microprofile.reactive.messaging.Acknowledgment) HealthCenter(io.smallrye.reactive.messaging.providers.extension.HealthCenter) CompletableFuture(java.util.concurrent.CompletableFuture) ProviderMessages.msg(io.smallrye.reactive.messaging.providers.i18n.ProviderMessages.msg) Function(java.util.function.Function) ConverterUtils(io.smallrye.reactive.messaging.providers.helpers.ConverterUtils) Multi(io.smallrye.mutiny.Multi) Uni(io.smallrye.mutiny.Uni) MessageConverter(io.smallrye.reactive.messaging.MessageConverter) Objects(java.util.Objects) Message(org.eclipse.microprofile.reactive.messaging.Message) Invoker(io.smallrye.reactive.messaging.Invoker) CompletionStage(java.util.concurrent.CompletionStage) ProviderExceptions.ex(io.smallrye.reactive.messaging.providers.i18n.ProviderExceptions.ex) Vertx(io.vertx.mutiny.core.Vertx) Optional(java.util.Optional) ProviderLogging.log(io.smallrye.reactive.messaging.providers.i18n.ProviderLogging.log) MediatorConfiguration(io.smallrye.reactive.messaging.MediatorConfiguration) BroadcastHelper(io.smallrye.reactive.messaging.providers.helpers.BroadcastHelper) Subscriber(org.reactivestreams.Subscriber) Instance(javax.enterprise.inject.Instance) LocalContextMetadata(io.smallrye.reactive.messaging.providers.locals.LocalContextMetadata) Context(io.vertx.mutiny.core.Context) LocalContextMetadata(io.smallrye.reactive.messaging.providers.locals.LocalContextMetadata) Vertx(io.vertx.mutiny.core.Vertx) CompletionStage(java.util.concurrent.CompletionStage)

Example 13 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.

the class MutinyEmitterImpl method send.

@Override
@CheckReturnValue
public Uni<Void> send(T payload) {
    if (payload == null) {
        throw ex.illegalArgumentForNullValue();
    }
    // If we are running on a Vert.x I/O thread, we need to capture the context to switch back
    // during the emission.
    Context context = Vertx.currentContext();
    Uni<Void> uni = Uni.createFrom().emitter(e -> emit(ContextAwareMessage.of(payload).withAck(() -> {
        e.complete(null);
        return CompletableFuture.completedFuture(null);
    }).withNack(reason -> {
        e.fail(reason);
        return CompletableFuture.completedFuture(null);
    })));
    if (context != null) {
        uni = uni.emitOn(runnable -> context.runOnContext(x -> runnable.run()));
    }
    return uni;
}
Also used : Context(io.vertx.core.Context) Message(org.eclipse.microprofile.reactive.messaging.Message) CheckReturnValue(io.smallrye.common.annotation.CheckReturnValue) MutinyEmitter(io.smallrye.reactive.messaging.MutinyEmitter) ProviderExceptions.ex(io.smallrye.reactive.messaging.providers.i18n.ProviderExceptions.ex) Vertx(io.vertx.core.Vertx) CompletableFuture(java.util.concurrent.CompletableFuture) ProviderLogging(io.smallrye.reactive.messaging.providers.i18n.ProviderLogging) Cancellable(io.smallrye.mutiny.subscription.Cancellable) Context(io.vertx.core.Context) ContextAwareMessage(io.smallrye.reactive.messaging.providers.locals.ContextAwareMessage) Uni(io.smallrye.mutiny.Uni) CheckReturnValue(io.smallrye.common.annotation.CheckReturnValue)

Example 14 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.

the class MutinyEmitterInjectionTest method testWithPayloadsAndAckComingBackOnSameEventLoop.

@Test
public void testWithPayloadsAndAckComingBackOnSameEventLoop() {
    final MyBeanEmittingPayloadsWithAck bean = installInitializeAndGet(MyBeanEmittingPayloadsWithAck.class);
    List<Uni<Void>> unis = new CopyOnWriteArrayList<>();
    assertThat(bean.emitter()).isNotNull();
    Vertx vertx = Vertx.vertx();
    Context context = vertx.getOrCreateContext();
    context.runOnContext(x -> unis.add(bean.emitter().send("a")));
    AtomicReference<Context> reference = new AtomicReference<>();
    await().until(() -> unis.size() == 1);
    unis.get(0).invoke(x -> reference.set(Vertx.currentContext())).await().indefinitely();
    assertThat(reference.get()).isEqualTo(context);
    context = ((VertxInternal) vertx).createEventLoopContext();
    context.runOnContext(x -> unis.add(bean.emitter().send("b")));
    await().until(() -> unis.size() == 2);
    unis.get(1).invoke(x -> reference.set(Vertx.currentContext())).await().indefinitely();
    assertThat(reference.get()).isEqualTo(context);
}
Also used : Context(io.vertx.core.Context) Uni(io.smallrye.mutiny.Uni) AtomicReference(java.util.concurrent.atomic.AtomicReference) Vertx(io.vertx.core.Vertx) Test(org.junit.jupiter.api.Test)

Example 15 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-graphql by smallrye.

the class GraphQLTransportWSSubprotocolHandler method initialize.

private Uni<Void> initialize() {
    return Uni.createFrom().emitter(initializationEmitter -> {
        if (log.isTraceEnabled()) {
            log.trace("Initializing websocket with graphql-transport-ws protocol");
        }
        connectionInitMessage = Json.createObjectBuilder().add("type", "connection_init").build();
        pongMessage = Json.createObjectBuilder().add("type", "pong").add("payload", Json.createObjectBuilder().add("message", "keepalive")).build();
        webSocket.closeHandler((v) -> {
            onClose.run();
            if (webSocket.closeStatusCode() != null) {
                if (webSocket.closeStatusCode() == 1000) {
                    log.debug("WebSocket closed with status code 1000");
                    // even if the status code is OK, any unfinished single-result operation
                    // should be marked as failed
                    uniOperations.forEach((id, emitter) -> emitter.fail(new InvalidResponseException("Connection closed before data was received")));
                    multiOperations.forEach((id, emitter) -> emitter.complete());
                } else {
                    InvalidResponseException exception = new InvalidResponseException("Server closed the websocket connection with code: " + webSocket.closeStatusCode() + " and reason: " + webSocket.closeReason());
                    uniOperations.forEach((id, emitter) -> emitter.fail(exception));
                    multiOperations.forEach((id, emitter) -> emitter.fail(exception));
                }
            } else {
                InvalidResponseException exception = new InvalidResponseException("Connection closed");
                uniOperations.forEach((id, emitter) -> emitter.fail(exception));
                multiOperations.forEach((id, emitter) -> emitter.fail(exception));
            }
        });
        webSocket.exceptionHandler(this::failAllActiveOperationsWith);
        send(webSocket, connectionInitMessage);
        // set up a timeout for subscription initialization
        Cancellable timeoutWaitingForConnectionAckMessage = null;
        if (connectionInitializationTimeout != null) {
            timeoutWaitingForConnectionAckMessage = Uni.createFrom().item(1).onItem().delayIt().by(Duration.ofMillis(connectionInitializationTimeout)).subscribe().with(timeout -> {
                initializationEmitter.fail(new InvalidResponseException("Server did not send a connection_ack message"));
                webSocket.close((short) 1002, "Timeout waiting for a connection_ack message");
            });
        }
        // make an effectively final copy of this value to use it in a lambda expression
        Cancellable finalTimeoutWaitingForConnectionAckMessage = timeoutWaitingForConnectionAckMessage;
        webSocket.handler(text -> {
            if (log.isTraceEnabled()) {
                log.trace("<<< " + text);
            }
            try {
                JsonObject message = parseIncomingMessage(text.toString());
                MessageType messageType = getMessageType(message);
                switch(messageType) {
                    case PING:
                        send(webSocket, pongMessage);
                        break;
                    case CONNECTION_ACK:
                        // TODO: somehow protect against this being invoked multiple times?
                        if (finalTimeoutWaitingForConnectionAckMessage != null) {
                            finalTimeoutWaitingForConnectionAckMessage.cancel();
                        }
                        initializationEmitter.complete(null);
                        break;
                    case NEXT:
                        handleData(message.getString("id"), message.getJsonObject("payload"));
                        break;
                    case ERROR:
                        handleOperationError(message.getString("id"), message.getJsonArray("payload"));
                        break;
                    case COMPLETE:
                        handleComplete(message.getString("id"));
                        break;
                    case CONNECTION_INIT:
                    case PONG:
                    case SUBSCRIBE:
                        break;
                }
            } catch (JsonParsingException | IllegalArgumentException e) {
                log.error("Unexpected message from server: " + text);
            // should we fail the operations here?
            }
        });
    });
}
Also used : WebSocketSubprotocolHandler(io.smallrye.graphql.client.vertx.websocket.WebSocketSubprotocolHandler) Logger(org.jboss.logging.Logger) CompletableFuture(java.util.concurrent.CompletableFuture) Uni(io.smallrye.mutiny.Uni) JsonValue(javax.json.JsonValue) ResponseReader(io.smallrye.graphql.client.impl.ResponseReader) OperationIDGenerator(io.smallrye.graphql.client.vertx.websocket.opid.OperationIDGenerator) Duration(java.time.Duration) Map(java.util.Map) Json(javax.json.Json) InvalidResponseException(io.smallrye.graphql.client.InvalidResponseException) JsonObject(javax.json.JsonObject) GraphQLClientException(io.smallrye.graphql.client.GraphQLClientException) MultiEmitter(io.smallrye.mutiny.subscription.MultiEmitter) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) JsonArray(javax.json.JsonArray) UniEmitter(io.smallrye.mutiny.subscription.UniEmitter) WebSocket(io.vertx.core.http.WebSocket) Collectors(java.util.stream.Collectors) JsonString(javax.json.JsonString) IncrementingNumberOperationIDGenerator(io.smallrye.graphql.client.vertx.websocket.opid.IncrementingNumberOperationIDGenerator) List(java.util.List) StringReader(java.io.StringReader) GraphQLError(io.smallrye.graphql.client.GraphQLError) Cancellable(io.smallrye.mutiny.subscription.Cancellable) JsonParsingException(javax.json.stream.JsonParsingException) JsonObjectBuilder(javax.json.JsonObjectBuilder) Cancellable(io.smallrye.mutiny.subscription.Cancellable) JsonObject(javax.json.JsonObject) InvalidResponseException(io.smallrye.graphql.client.InvalidResponseException) JsonParsingException(javax.json.stream.JsonParsingException)

Aggregations

Uni (io.smallrye.mutiny.Uni)44 Multi (io.smallrye.mutiny.Multi)21 Test (org.junit.jupiter.api.Test)18 List (java.util.List)17 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)17 Duration (java.time.Duration)16 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)14 IOException (java.io.IOException)13 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)13 AtomicReference (java.util.concurrent.atomic.AtomicReference)13 Assertions.assertThrows (org.junit.jupiter.api.Assertions.assertThrows)13 AssertSubscriber (io.smallrye.mutiny.helpers.test.AssertSubscriber)12 Function (java.util.function.Function)12 Supplier (java.util.function.Supplier)12 Map (java.util.Map)11 Consumer (java.util.function.Consumer)10 CompositeException (io.smallrye.mutiny.CompositeException)9 ArrayList (java.util.ArrayList)9 ApplicationScoped (javax.enterprise.context.ApplicationScoped)8 CompletableFuture (java.util.concurrent.CompletableFuture)7