Scala 脚本等待 mongo 完成任务
Scala script wait for mongo to complete task
我正在编写一个简单的基于 scala 的脚本,它应该将一些数据插入到 Mongo 集合中。问题是,该脚本在 mongo 完成任务之前退出。考虑以下脚本,idiomatic/best 处理问题的方法是什么:
#!/usr/bin/env scalas
/***
scalaVersion := "2.12.2"
libraryDependencies ++= {
Seq(
"org.mongodb.scala" %% "mongo-scala-driver" % "2.1.0"
)
}
*/
import org.mongodb.scala._
val mongoClient: MongoClient = MongoClient("mongodb://localhost")
val database: MongoDatabase = mongoClient.getDatabase("dev")
val doc: Document = Document("name" -> "MongoDB", "type" -> "database",
"count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))
val collection: MongoCollection[Document] = database.getCollection("test")
val subscription = new Observer[Completed] {
override def onNext(result: Completed): Unit = println("Inserted")
override def onError(e: Throwable): Unit = println("Failed"+e.toString)
override def onComplete(): Unit = println("Completed")
}
collection.insertOne(doc).subscribe(subscription)
上面的脚本在执行时产生以下错误:
com.mongodb.MongoInterruptedException: Interrupted acquiring a permit to retrieve an item from the pool
但是,如果我在最后添加 Thread.sleep(3000)
,它就完成得很好。
我建议使用 Promise 对象来通知异步作业的完成。
http://www.scala-lang.org/api/2.12.1/scala/concurrent/Promise.html
异步作业完成或超时后,程序将退出。
val promise = Promise[Boolean]
...
override def onError(e: Throwable): Unit = {
println("Failed"+e.toString)
promise.success(false)
}
override def onComplete(): Unit = {
println("Completed")
promise.success(true)
}
val future = promise.future
Await.result(future, Duration(10, java.util.concurrent.TimeUnit.SECONDS))
//after completion, the program would exit.
我正在编写一个简单的基于 scala 的脚本,它应该将一些数据插入到 Mongo 集合中。问题是,该脚本在 mongo 完成任务之前退出。考虑以下脚本,idiomatic/best 处理问题的方法是什么:
#!/usr/bin/env scalas
/***
scalaVersion := "2.12.2"
libraryDependencies ++= {
Seq(
"org.mongodb.scala" %% "mongo-scala-driver" % "2.1.0"
)
}
*/
import org.mongodb.scala._
val mongoClient: MongoClient = MongoClient("mongodb://localhost")
val database: MongoDatabase = mongoClient.getDatabase("dev")
val doc: Document = Document("name" -> "MongoDB", "type" -> "database",
"count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))
val collection: MongoCollection[Document] = database.getCollection("test")
val subscription = new Observer[Completed] {
override def onNext(result: Completed): Unit = println("Inserted")
override def onError(e: Throwable): Unit = println("Failed"+e.toString)
override def onComplete(): Unit = println("Completed")
}
collection.insertOne(doc).subscribe(subscription)
上面的脚本在执行时产生以下错误:
com.mongodb.MongoInterruptedException: Interrupted acquiring a permit to retrieve an item from the pool
但是,如果我在最后添加 Thread.sleep(3000)
,它就完成得很好。
我建议使用 Promise 对象来通知异步作业的完成。
http://www.scala-lang.org/api/2.12.1/scala/concurrent/Promise.html
异步作业完成或超时后,程序将退出。
val promise = Promise[Boolean]
...
override def onError(e: Throwable): Unit = {
println("Failed"+e.toString)
promise.success(false)
}
override def onComplete(): Unit = {
println("Completed")
promise.success(true)
}
val future = promise.future
Await.result(future, Duration(10, java.util.concurrent.TimeUnit.SECONDS))
//after completion, the program would exit.