J'utilise une bibliothèque dans une application vert.x qui retourne Projet du réacteur de type Mono .
J'ai un verticle qui reçoit ce type réactif et est destiné à envoyer le contenu par le bus de l'événement à un autre 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()));
}
}
Est-ce la bonne approche? Dois-je passer à la piscine de fil de boucle d'événement vert.x avant d'envoyer le message au bus de l'événement? il est tout ce que je devrais être au courant lorsque vous utilisez ces bibliothèques ensemble?
Le code me semble bon, sauf que vous ne devez pas utiliser le groupe boucle d'événements Netty comme exécuteur, mais plutôt le contexte 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()));
}
}
Avec programmateur d'un tel, vous obtenez l'assurance que l'Etat verticle ne sera pas modifié par un fil autre que la boucle de l'événement, il a été attribué.