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

xot*_*nic 3 java asynchronous vert.x

我是Vert.x的新手.

例如,JDBCClient具有非阻塞方法

JDBCClient.getConnection(Handler<AsyncResult<SQLConnection>> handler)
Run Code Online (Sandbox Code Playgroud)

当我调用它时,它实际上是异步的.

jdbcClient.getConnection(result -> { /* this code will execute asynchonous */})
Run Code Online (Sandbox Code Playgroud)

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

当我写这个例子时,它看起来并不异步.它只会执行方法体,然后将调用传递的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 -> { /* ... */ })
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*pes 6

您的代码没有任何问题,您的代码样式通常是异步的,因为您执行IO操作或调用vert.x API时,异步操作会将您从当前线程(事件循环)中分离出来.

在你的情况下,你正在使用CPU绑定代码,因此它不会表现为async,因为你所说的只是调用lambda.如果你想让它异步,你总是可以用你的代码包装runOnContext它,并将它排队在事件循环的下一次迭代中运行,例如:

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