我是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我的方法应该是异步的?一些注释或其他什么?
答案 0 :(得分:6)
您的代码没有任何问题,您的代码样式通常是异步的,因为您执行IO操作或调用vert.x API时,异步操作会将您从当前线程(事件循环)中分离出来。 / p>
在你的情况下,你正在进行CPU绑定代码,因此它不像异步那样,你所说的只是调用lambda。如果你想让它异步,你总是可以用from("direct:processFile")
.pollEnrich().simple("ftp://localhost:21/folder?fileName=${body.fileName}")
.log("Start downloading file ${file:name}.")
.unmarshal().bindy(BindyType.Csv, MyFile.class)
.to("bean:fileProcessor")
.log("Downloaded file ${file:name} complete.");
包裹你的代码,并将它排队在事件循环的下一次迭代中运行,例如:
runOnContext