java - 如何在 Vert.x 中实现自定义异步操作?

标签 java asynchronous vert.x

我是 Vert.x 的新手。

例如,JDBCClient有非阻塞方法

JDBCClient.getConnection(Handler<AsyncResult<SQLConnection>> handler)

当我调用它时,它真的是异步的。

jdbcClient.getConnection(result -> { /* this code will execute asynchonous */})

但是如何使用非阻塞方法实现我自己的组件呢?

当我写这个例子时,它看起来并不异步。它只会执行方法体,然后调用传递的 lambda。

 class MyComponent { 
   public void getSomething(Handler<AsyncResult<String>> handler) {
       String result = someHeavyMethodInThisThread();
       handler.handle(Future.succeededFuture(result));
   }
 }
 /* later */

 /* this code will be blocking, right? */
 myComponent.getSomething(res -> { /* ... */ })

也许有办法告诉 Vert.x 我的方法应该是异步的?一些注释或其他什么?

最佳答案

你的代码没有问题,你的代码风格通常是异步的,因为当你执行 IO 操作或调用 vert.x API 时,异步操作将使你脱离当前线程(事件循环)。

在您的情况下,您正在执行 CPU 绑定(bind)代码,因此它不会表现得像异步一样,正如您所说,只会调用 lambda。如果你仍然想让它异步,你总是可以用 runOnContext 包装你的代码,这将使它排队在事件循环的下一次迭代中运行,例如:

class MyComponent { 
  public void getSomething(Handler<AsyncResult<String>> handler) {
    vertx.runOnContext(v -> {
      String result = someHeavyMethodInThisThread();
      handler.handle(Future.succeededFuture(result));
    });
  }
}

关于java - 如何在 Vert.x 中实现自定义异步操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47460419/

相关文章:

c++ - Boost 的 UDP 异步客户端接收自己的数据报

c# - 使用 C# 将同步方法转换为异步方法

java - 我可以在 tomcat 或 jboss 等应用程序服务器中运行 vert.x 实例吗

java - OpenCL 编译失败 aparapi

java - 我的 GUI 没有完全显示

c# - 您可以使用 Task.Run 将受 CPU 限制的工作移至后台线程

docker - 带有桥接网络的 docker 容器上的 Vert.x + Hazelcast 集群

java - 在 JavaFX 中使用 vert.x http 服务器

java - 有人可以帮助我吗?我怎么了 Volley 获取请求

java - 如何内存长度为 n 的递归路径搜索