Scala Slick 3.0-RC3因java.util.concurrent.RejectedExecutionException失败

Scala Slick 3.0-RC3因java.util.concurrent.RejectedExecutionException失败,scala,concurrency,slick,Scala,Concurrency,Slick,我试图熟悉Slick 3.0和Futures(使用Scala 2.11.6)。我使用基于的简单代码。为什么以下代码以异常终止,以及如何修复它 import scala.concurrent.Await import scala.concurrent.duration._ import slick.jdbc.JdbcBackend.Database import scala.concurrent.ExecutionContext.Implicits.global class Dispatcher

我试图熟悉Slick 3.0和Futures(使用Scala 2.11.6)。我使用基于的简单代码。为什么以下代码以异常终止,以及如何修复它

import scala.concurrent.Await
import scala.concurrent.duration._
import slick.jdbc.JdbcBackend.Database
import scala.concurrent.ExecutionContext.Implicits.global

class Dispatcher(db: Database, dal: DAL) {
  import dal.driver.api._

  def init() = {
    db.run(dal.create)
    try db.run(dal.stuffTable += Stuff(23,"hi"))
    finally db.close

    val x = {
      try db.run(dal.stuffTable.filter(_.serial === 23).result)
      finally db.close
    }
    // This crashes:
    val result = Await.result(x, 2 seconds)
  }
}
执行失败,原因是:

java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$2@5c73f637 rejected from java.util.concurrent.ThreadPoolExecutor@4129c44c[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 2]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
    at scala.concurrent.impl.ExecutionContextImpl$$anon$1.execute(ExecutionContextImpl.scala:136)
    at slick.backend.DatabaseComponent$DatabaseDef$class.runSynchronousDatabaseAction(DatabaseComponent.scala:224)
    at slick.jdbc.JdbcBackend$DatabaseDef.runSynchronousDatabaseAction(JdbcBackend.scala:38)
    at slick.backend.DatabaseComponent$DatabaseDef$class.runInContext(DatabaseComponent.scala:201)
    at slick.jdbc.JdbcBackend$DatabaseDef.runInContext(JdbcBackend.scala:38)
    at slick.backend.DatabaseComponent$DatabaseDef$class.runInternal(DatabaseComponent.scala:75)
    at slick.jdbc.JdbcBackend$DatabaseDef.runInternal(JdbcBackend.scala:38)
    at slick.backend.DatabaseComponent$DatabaseDef$class.run(DatabaseComponent.scala:72)
    at slick.jdbc.JdbcBackend$DatabaseDef.run(JdbcBackend.scala:38)
    at Dispatcher.init(Dispatcher.scala:15)
    at SlickDemo$.main(SlickDemo.scala:16)
    at SlickDemo.main(SlickDemo.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)

我认为在您尝试执行的操作中存在一些不正确的地方:Slick的
run
方法不会返回
Unit
,也不会像以前的版本那样异常失败
run
现在返回一个
Future
,因此如果您想按顺序运行操作,您需要
flatMap
步骤,或者使用以下步骤进行理解:

def init() = {
  val = results for {
    _ <- db.run(dal.create)
    _ <- db.run(dal.stuffTable += Stuff(23, "hi"))
    r <- db.run(dal.stuffTable.filter(_.serial === 23).result)
  } yield r
}

那么什么时候应该调用db.close呢?您可以使用
result
future上的
onComplete
功能关闭数据库。这可能是您只想在关闭应用程序时执行的操作,因为您通常不想为您执行的每个数据库访问创建新连接。Yeesh。为什么即使在当前版本中,所有示例都使用了
Await
?关于如何管理
onFailure()
,是否有好的链接或示例?
result.onFailure { case NonFatal(ex) => // do something with the exception }