Scala MongoDB驱动程序 - 如何在Observable和Inserting上执行阻塞

时间:2017-05-16 11:28:37

标签: mongodb scala concurrency blocking mongo-scala-driver

所以我有2个集合,让我们说集合和其他集合,我想将这个其他集合中的数据插入到另一个集合中集合包含可以处理为新形式数据的数据,其中将存储到此新集合中。这个过程将一气呵成。问题是Scala MongoDB驱动程序的异步行为是一个问题。我希望这个新集合能够自动增加,因为我在插入数据库后需要ID。

所以明显的步骤是:

  1. 订阅其他收藏品findAll Observable,并获取发出的数据
  2. 计算新集合上的数据以找出amout,递增1并获得发出数据的最后一个id
  3. 处理数据(映射,变异等)
  4. 将新数据插入新集合
  5. 现在的问题是,在第2步和第4步之间,在插入数据之前有一些延迟,因为它有时会抛出一个Exception,在将数据插入MongoDB时 重复ID 。我还是没有找到阻止文档的内容。

    我应该如何阻止observable以便在其他线程完成后启动进程?

    或者有更好的方法来做我想要的吗?我愿意接受建议

    欢迎任何阅读参考, 感谢

1 个答案:

答案 0 :(得分:0)

编辑:经过更多的搜索之后,我发现了一种更类似于Scala的方法来解决此问题:

ProfileComponent

这完全像它的样子:运行查询,等待查询完成,然后返回结果。


我写了这段代码来解决一个非常相似的问题。有点破解,但是可以用。

import scala.concurrent.Await
import scala.concurrent.duration.Duration
import org.mongodb.scala.{Observable,Completed}

...

val query: Observable[Completed] = collection.insertOne(food)
val result = Await.result(query.toFuture, Duration.Inf)

获取信号量会将其设置为零,然后导致下一次获取阻塞。然后,该线程将进入睡眠状态,直到观察者完成或遇到错误为止,在功能上获得与订阅已阻止相同的结果。