Java 在Vert.x应用程序中使用ProjectReactor

Java 在Vert.x应用程序中使用ProjectReactor,java,reactive-programming,vert.x,project-reactor,reactive-streams,Java,Reactive Programming,Vert.x,Project Reactor,Reactive Streams,我正在Vert.x应用程序中使用一个库,它返回类型 我有一个verticle,它接收这种反应类型,并打算通过事件总线将内容发送到另一个verticle: 导入io.vertx.core.AbstractVerticle; 导入io.vertx.core.eventbus.Message; 导入reactor.core.publisher.Mono; 导入reactor.core.scheduler.Schedulers; 导入java.time.Duration; 公共类helperticle扩

我正在Vert.x应用程序中使用一个库,它返回类型

我有一个verticle,它接收这种反应类型,并打算通过事件总线将内容发送到另一个verticle:

导入io.vertx.core.AbstractVerticle; 导入io.vertx.core.eventbus.Message; 导入reactor.core.publisher.Mono; 导入reactor.core.scheduler.Schedulers; 导入java.time.Duration; 公共类helperticle扩展了AbstractVerticle { 公共静态最终字符串地址=地址_1; @凌驾 公共void开始抛出异常 { vertx.eventBus.consumerADDRESS,this::Consumer; } 专用消息消息 { Mono.delayDuration.of百万3000 .然后返回Mono的内容//这将来自外部库 .publishOnSchedulers.fromExecutorvertx.nettyEventLoopGroup//是否需要此选项? .subscribeoutput-> { System.out.printlnMy verticle:+Thread.currentThread.getName; message.replyyoutput++message.body; },error->message.fail1,error.getMessage; } }
这是正确的方法吗?在将消息发送到事件总线之前,是否应该切换到Vert.x事件循环线程池?在一起使用这些库时,有什么我应该注意的吗?

代码对我来说很好,只是您不应该使用Netty事件循环组作为执行器,而应该使用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()));
    }
}

有了这样一个调度器,您可以确保垂直循环状态不会被分配给它的事件循环以外的线程修改。

我觉得代码不错,只是您不应该使用Netty事件循环组作为执行器,而应该使用垂直循环上下文:

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()));
    }
}

有了这样一个调度器,您就可以确保verticle状态不会被分配给它的事件循环以外的线程修改。

我看不出verticle在哪里接收Mono对象。在这个虚拟示例中,它是在verticle中创建的。在真正的应用程序中,它将通过方法调用来自库。该方法将从verticle调用。我看不到verticle在哪里接收Mono对象。在这个虚拟示例中,它是在verticle中创建的。在真正的应用程序中,它将通过方法调用来自库。该方法将从垂直体调用。