我已经开始在我们的scala akka-http项目中使用mongo scala驱动程序并且它提供了很大帮助,特别是v2.0.0中的案例类支持非常漂亮。我试图围绕如何使用observeOn的非默认执行上下文使用mongo scala驱动程序。
由于我们的java库依赖项的性质,我正在使用阻塞调用来获取MongoDB的结果,如此处所示Helpers。我已经使用observeOn稍微修改了MongoDB Helpers的结果和headResult函数,但是我注意到一些我不知道如何解决的奇怪竞争条件。
trait ImplicitObservable[C] {
val observable: Observable[C]
val converter: (C) => String
def headResult()(implicit executionContext: ExecutionContext) = Await.result(observable.observeOn(executionContext).head(), Duration(10, TimeUnit.SECONDS))
def results()(implicit executionContext: ExecutionContext): List[C] = Await.result(observable.observeOn(executionContext).toFuture(), Duration(20, TimeUnit.SECONDS)).toList
}
结果函数不返回我期望的所有记录,并且每次行为都不同,除非我使用仅允许一个线程的akka PinnedDispatcher。由于它是一个阻塞操作,我想使用非默认的akka调度程序,以便它不会阻止我的HTTP请求。如果有人能帮助我,我真的很感激。
# looking up dispatcher
val executionContext = system.dispatchers.lookup("mongo-dispatcher")
# application.conf
mongo-dispatcher {
type = Dispatcher
executor = "thread-pool-executor"
thread-pool-executor {
fixed-pool-size = 100
}
throughput = 1
}
我的示例数据库客户端代码:
def getPersonById(personId: String): PersonCaseClass = {
personCollection.find[PersonCaseClass](equal("_id", "person_12345")).first().headResult()
}