Mongo scala驱动程序2.0具有非默认的akka​​执行上下文

时间:2017-06-06 02:01:48

标签: mongodb scala akka akka-http mongo-scala-driver

我已经开始在我们的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()
}

0 个答案:

没有答案