当前位置: 首页 > 知识库问答 >
问题:

使用vertx编写顺序代码

鲁霄
2023-03-14

我有两个操作step\u 1()和step\u 2(),希望在step\u 1()之后执行step\u 2()。

对于普通java,这将是:

step_1();
step_2();

对于vertx,我必须使用vertx-compose()。我说得对吗?

根据https://groups.google.com/forum/#哦!topic/vertx/FuvlPLpoGOA,我不需要序列代码的未来。

“如果你想按顺序完成每个请求,你不需要未来。”

那么,如果不使用期货,我怎么能做到这一点呢?

我不知道这是否重要:执行此代码的Vertx是一个“Worker”垂直体。

@Override
public void start(Future<Void> fut) throws IOException {

Future<Void> step_1 = Future.future();
    step_1.compose(res -> {
        // If the future succeeded
        Future<Void> step_2 = step_1();

        step_2.compose(res2 -> {
            step_2();

        }, Future.future().setHandler(handler -> {
            // If the future failed
        }));

        //I dont need that
    }, Future.future().setHandler(handler -> {
        // If the future failed
    }));

}

public void step_1(){
..
}

public void step_2(){
..
}

这是最右边最短的(!)方法

共有3个答案

太叔昊穹
2023-03-14

RxJava专门用于编写异步事件:http://vertx.io/docs/vertx-rx/java/

假设step\u 1()和step\u 1()都不是为了返回结果而设计的(即,它们实际上返回void),那么您可以将它们更改为返回Observable或Single,并将它们链接在一起,类似于此:

step_1().doOnSuccess(this::step_2()).subscribe(/* control resumes here */);

RxJava(或者更确切地说,一般的反应式编程)需要一点时间才能理解它,但如果您计划将异步操作链接在一起,我强烈建议您使用它。

芮祺
2023-03-14

“如果你想按顺序完成每个请求,你不需要未来。”

不,不是。在像Vert. x这样的异步框架中,输入/输出操作是非阻塞的。这意味着,如果您调用几个异步操作,它们将同时开始工作。如果您想按顺序执行几个请求,那么您应该使用期货或回调仅在前一个成功完成后执行新请求。

请使用futures、RxJava 2的更新版本和关于项目的文章检查此代码。

@Override
public Future<Optional<Todo>> getCertain(String todoID) {
    Future<Optional<Todo>> result = Future.future();
    redis.hget(Constants.REDIS_TODO_KEY, todoID, res -> {
        if (res.succeeded()) {
            result.complete(Optional.ofNullable(
                res.result() == null ? null : new Todo(res.result())));
        } else
            result.fail(res.cause());
    });
    return result;
}

@Override
public Future<Todo> update(String todoId, Todo newTodo) {
    return this.getCertain(todoId).compose(old -> {
        if (old.isPresent()) {
            Todo fnTodo = old.get().merge(newTodo);
            return this.insert(fnTodo)
                .map(r -> r ? fnTodo : null);
        } else {
            return Future.succeededFuture();
        }
    });
}
孙思源
2023-03-14

下面是一个链接未来的例子,我把这个例子做得很简单,但它展示了这个概念。

@RunWith(VertxUnitRunner.class)
public class Chaining {
    private Vertx vertx = Vertx.vertx();

    @Test
    public void futures_chaining(TestContext context) throws Exception {
        Async async = context.async();

        firstOperation()
                .compose((outcome) -> {
                    System.out.println(outcome);

                    return secondOperation();
                })
                .compose(outcome -> {
                    System.out.println(outcome);

                    /*
                      For stopping unit test we are returning this future                                                                                                                                                              
                      for production use-case this would be Future.succeededFuture 
                      or Future.failedFuture depending on your method outcomes
                     */
                    return Future.future(handle -> async.complete());
                });
    }

    private Future<String> firstOperation() {
        Future<String> future = Future.future();

        vertx.setTimer(1000, delay -> future.complete("First Operation Complete"));

        return future;
    }

    private Future<String> secondOperation() {
        Future<String> future = Future.future();

        vertx.setTimer(1000, delay -> future.complete("Second Operation Complete"));

        return future;
    }
}
 类似资料:
  • 我正在使用vertx websocket。我正在通过它发送一个大文件。使用文件系统的最佳方式是什么?如果多个帧到达同一个文件,异步文件系统可能无法正常工作。有什么建议吗?

  • 我需要以RxJava风格按顺序链接Vertx CompositeFuture,以获得相关CompositeFuture,避免回调地狱。 用例: 每个CompositeFuture.any/all做一些返回期货的异步操作,比如myList1、myList2、myList3,但是我必须等待CompositeFuture.any(myList1)完成并返回成功,然后再做CompositeFuture.a

  • 我有一个逻辑,我需要将数据保存在两个表中(一对多)。我在我的Java中创建了两个方法,我正在尝试使用Vertx Future和compose来按顺序实现逻辑。但是我已经走了一半,不明白当第一个未来完成时如何实现compose。我的意思是第一个未来的代码运行anAsyncAction_1(料ToAdd);,记录保存在数据库中,但是现在我如何在compose中调用我的第二个方法 下面是我的代码

  • 在我的示例项目中,我尝试在应用程序启动时做一些初始化工作。 Java 16 Vertx 4.1.0 检查完整的项目代码。 但它并没有像预期的那样工作。 没有像Reactor那样的方法 我找不到一种有效的方法来按顺序执行它们。 更新时间: 我按照建议更改了代码。 并在控制台中获取以下日志。 如何在输入打印结果之前确保插入块中的所有未来都已完成。

  • 在进一步介绍之前,让我们花点时间来讨论编写"通用"代码时的约束条件 - 即运行在服务器和客户端的代码。由于用例和平台 API 的差异,当运行在不同环境中时,我们的代码将不会完全相同。所以这里我们将会阐述你需要理解的关键事项。 服务器上的数据响应 在纯客户端应用程序 (client-only app) 中,每个用户会在他们各自的浏览器中使用新的应用程序实例。对于服务器端渲染,我们也希望如此:每个请求

  • 书写顺序 1. 不强制要求声明的书写顺序。 如果团队规范有要求,建议使用工具来自动化排序,比如 CSScomb,或者使用 @wangjeaf 开发的 ckstyle 推荐以声明的特性作为分组,不同分组间保留一个空行,例如: .dialog { /* 定位 */ margin: auto; position: absolute; top: 0; bottom: 0; righ