Usando proyecto de reactor en una aplicación Vert.x

Martin Tarjanyi:

Estoy usando una biblioteca en una aplicación Vert.x que devuelve proyecto de reactor de tipo mono .

Tengo un verticle que recibe este tipo reactivo y está destinado a enviar el contenido a través del bus evento a otro verticle:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.eventbus.Message;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import java.time.Duration;

public class HelperVerticle extends AbstractVerticle
{
    public static final String ADDRESS = "address_1";

    @Override
    public void start() throws Exception
    {
        vertx.eventBus().consumer(ADDRESS, this::consume);
    }

    private void consume(Message<Object> message)
    {
        Mono.delay(Duration.ofMillis(3000)) 
            .thenReturn("Content of Mono.") // this would come from external library
            .publishOn(Schedulers.fromExecutor(vertx.nettyEventLoopGroup())) // is this needed?
            .subscribe(output ->
            {
                System.out.println("My verticle: " + Thread.currentThread().getName());
                message.reply(output + " " + message.body());
            }, error -> message.fail(1, error.getMessage()));
    }
}

Este es el enfoque correcto? ¿Debo cambiar a grupo de subprocesos bucle de eventos Vert.x antes de enviar el mensaje al bus de eventos? ¿Hay algo que debería estar al tanto de cuando se utilizan estas bibliotecas juntos?

tsegismont:

El código se ve bien a mí, si no se debe utilizar el grupo bucle de eventos Netty como ejecutor, sino más bien el contexto verticle:

public class HelperVerticle extends AbstractVerticle
{
    public static final String ADDRESS = "address_1";

    private Scheduler scheduler;

    @Override
    public void start() throws Exception
    {
        scheduler = Schedulers.fromExecutor(command -> context.runOnContext(v -> command.run()));
        vertx.eventBus().consumer(ADDRESS, this::consume);
    }

    private void consume(Message<Object> message)
    {
        Mono.delay(Duration.ofMillis(3000)) 
            .thenReturn("Content of Mono.") // this would come from external library
            .publishOn(scheduler)
            .subscribe(output ->
            {
                System.out.println("My verticle: " + Thread.currentThread().getName());
                message.reply(output + " " + message.body());
            }, error -> message.fail(1, error.getMessage()));
    }
}

Con tal un programador, se obtiene el seguro que el estado verticle no será modificado por un hilo que no sea el bucle de eventos que ha sido asignado.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=317423&siteId=1
Recomendado
Clasificación