Slick 3.0-RC3失败,返回java.util.concurrent.RejectedExecutionException [英] Slick 3.0-RC3 fails with java.util.concurrent.RejectedExecutionException

查看:1203
本文介绍了Slick 3.0-RC3失败,返回java.util.concurrent.RejectedExecutionException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要熟悉Slick 3.0和Futures(使用Scala 2.11.6)。我使用基于 Slick的Multi-DB Cake Pattern示例的简单代码。为什么以下代码以异常终止并如何解决它?

I'm trying to get familiar with Slick 3.0 and Futures (using Scala 2.11.6). I use simple code based on Slick's Multi-DB Cake Pattern example. Why does the following code terminate with an exception and how to fix it?

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的运行方法不返回 Unit 一个异常 - 像以前的版本中一样。 run 现在返回 Future ,因此如果要按顺序运行操作,您需要 flatMap 的步骤,或使用for-comprehension:

I think that something is not correct in what you are trying to do: Slick's run method doesn't return Unit and doesn't fail with an exception - as it used to in previous versions. run now returns a Future, so if you want to run actions in sequence you need to flatMap the steps, or use a for-comprehension:

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 什么可能导致错误(即,数据库与运行实际查询的未来关闭,因此执行不会发生)。

I am not sure that you really need to use db.close that way: that is actually what may be causing the error (i.e. the db is closed in concurrence with the future that runs the actual queries so the execution can't happen).

如果您想句柄错误使用未来的功能,例如:

If you want to handle errors use Future's capabilities, e.g.:

result.onFailure { case NonFatal(ex) => // do something with the exception }

这篇关于Slick 3.0-RC3失败,返回java.util.concurrent.RejectedExecutionException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆