我正在开发一个Java / vertx项目,其后端是MongoDB(一段时间以来我曾经使用过Elixir / Erlang,对vertx来说我还很陌生,但我认为它是最合适的)。基本上,我有一个由HttpServerVerticles
处理的http API,需要将数据存储到mongo db(或从mongo db检索数据),并将适当的回复发送给API调用者。我正在寻找正确的模式来实现查询和答复的处理。
从官方指南和一些教程中,我看到对于关系JDBC数据库,有必要定义一个专用的版本来异步处理查询。这是我第一次尝试使用mongo客户端,但是它引入了许多样板。
另一方面,从mongo客户端文档中,我读到它是完全无阻塞,并且它具有自己的连接池。这是否意味着我们可以安全(从vertx事件循环的角度),直接在http verticle中定义和使用mongo客户端?
有其他替代模式吗?
版本:vertx:3.5.4 / mongodb:4.0.3
答案 0 :(得分:1)
是这样的:mongo连接池本质上与SQL-db池同步和阻塞一样,但是周围包裹着非阻塞的vert.x API。
因此,不是正常的
阻止方式JsonObject obj = mongo.get( someQuery )
您开箱即用的是非阻塞呼叫:
mongo.findOne( 'collectionName', someQuery ){ AsyncResult<JsonObject> res ->
JsonObject obj = res.result()
doStuff( obj )
}
这意味着,您可以在事件循环中的任何类型的立面上直接安全使用它,而无需一遍又一遍地重新发明异步轮。
答案 1 :(得分:0)
在我们的客户中,我们使用 public void ExplicitWait(MobileElement element,int timeOutInSeconds) {
(new WebDriverWait(driver, timeOutInSeconds)).until(ExpectedConditions
.visibilityOf(element));
}
。 Vertx支持RX(mongodb-driver-rx
),非常适合vertx-rx-java
。
有关更多信息,请参见: https://mongodb.github.io/mongo-java-driver-rx/ https://vertx.io/docs/vertx-rx/java/ https://github.com/vert-x3/vertx-examples/blob/master/rxjava-2-examples/src/main/java/io/vertx/example/reactivex/database/mongo/Client.java