在使用Scala futures时,如何捕获被拒绝的ExecutionException?

在使用Scala futures时,如何捕获被拒绝的ExecutionException?,scala,executorservice,futuretask,Scala,Executorservice,Futuretask,关闭执行器时,我应该在哪里捕获拒绝执行异常?我试过: future { Option(reader.readLine) } onComplete { case Success(v) => case Failure(e) => e match { case ree: RejectedExecutionException => // doesn't work } 以及

关闭执行器时,我应该在哪里捕获拒绝执行异常?我试过:

 future {
        Option(reader.readLine)
      } onComplete {
        case Success(v) =>
        case Failure(e) => e match {
          case ree: RejectedExecutionException =>
          // doesn't work
      }
以及:

也不起作用。仍然得到:

Exception in thread "pool-99-thread-1" java.util.concurrent.RejectedExecutionException
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1768)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658)
at scala.concurrent.impl.ExecutionContextImpl.execute(ExecutionContextImpl.scala:105)
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:37)
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:133)
at scala.concurrent.Promise$class.complete(Promise.scala:55)
at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:58)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

它必须由RejectedExecutionHandler处理。
java.util.concurrent.ThreadPoolExecutor.DiscardPolicy
或通过自定义实现

此执行器以静默方式传递RejectedExecutionException:

val executorService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue[Runnable], Executors.defaultThreadFactory, new DiscardPolicy)
我问过

我觉得当前注册的回调应该在关机时完成,如果它们运行在同一个执行器上。(或者行为应该由政策来管理。)(总有一天我会为我描述的内容提交一份公关,因为这看起来很自然。)

我以前有一个设置,其中一个单线程执行器读取一些文件并将作业馈送到另一个池。最初的设计是通过在提交时阻塞来限制进料器自身。这还可以,但不够灵活。我想在第二个池上分叉一些任务,但是提交当然会在那里阻塞

因此,考虑到阻塞是邪恶的,一旦您知道无法运行任务,您就必须决定如何处理它们

一个答案是,在启动关机之前,您需要等待静止。就我而言,我有很多工作要完成,所以我知道工作什么时候完成

Viktor Klang在该线程中的观点是,任务总是被分叉和提交的,因此,如果有人知道静止意味着什么,那就是应用程序,而不是基础设施

val executorService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue[Runnable], Executors.defaultThreadFactory, new DiscardPolicy)