Scala 未来调用命令和自定义执行器

Scala 未来调用命令和自定义执行器,scala,tail-recursion,Scala,Tail Recursion,我遇到了一个问题,执行器没有关闭,第二个未来调用在最后一个未来调用之后执行,并且程序没有终止 import java.util.concurrent.Executors import scala.concurrent.ExecutionContext val customExecutor: ExecutorService = Executors.newFixedThreadPool(serviceConfig.serviceConf.numberOfThreads)

我遇到了一个问题,执行器没有关闭,第二个未来调用在最后一个未来调用之后执行,并且程序没有终止


  import java.util.concurrent.Executors

  import scala.concurrent.ExecutionContext

  val customExecutor: ExecutorService =
    Executors.newFixedThreadPool(serviceConfig.serviceConf.numberOfThreads)
  implicit val customExecutionContext: ExecutionContext =
    ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))

  val remainingRecords = data.foldLeft(Seq.empty[Int]) {
    case (a, b) =>
      fetchAllData()
        .foldLeft(c) {
          case (a, file) =>
            sendInBatches(a)
        }
  }

  @scala.annotation.tailrec
  def sendData(res: Seq[Int]) = {
    ...
    futureCall() map { result =>
      logger.info(
        s"Successfully Executed"
      )
    }
    sendData()
  }

  if (remainingRecords.nonEmpty) {
    futureCall() map { result =>
      logger.info(
        s"Successfully executed the remaining"
      )
      customExecutor.shutdown()
    }
  }


我得到日志“成功执行剩余的”,然后“成功执行”,即使我手动关闭执行器,应用程序也不会停止。

这是一个很长的过程,但以下代码:

def sendData(res: Seq[Int]) =
    {
        ...
      futureCall() map { result =>
      logger.info(
      s"Successfully Executed"
      )
    }
      sendData()
    }
永不终止
executor.shutdown()
防止在线程池上调度新任务,但不会终止任何正在进行的任务,以允许正常关闭。因为这段代码正在运行,而且任务永远不会结束,所以执行者正在等待它完成,并且一直在等待


如果在递归调用
sendData()
之前通过添加一些检查来处理所有数据,则可以尝试使用
shutdownNow()
和/或使此循环有效地结束,但此代码:

def sendData(res: Seq[Int]) =
    {
        ...
      futureCall() map { result =>
      logger.info(
      s"Successfully Executed"
      )
    }
      sendData()
    }
永不终止
executor.shutdown()
防止在线程池上调度新任务,但不会终止任何正在进行的任务,以允许正常关闭。因为这段代码正在运行,而且任务永远不会结束,所以执行者正在等待它完成,并且一直在等待


您可以尝试使用
shutdownNow()
和/或在递归调用
sendData()

之前通过添加一些检查来处理所有数据,从而有效地结束这个无限循环?很难判断此代码中的一些可疑内容是在逻辑上,还是在
{}
中出现拼写错误。Mateusz Kubuszok,已修复。另外,我试图解决的问题是,你能修复int缩进吗?很难判断此代码中的一些可疑内容是在逻辑上,还是在
{}
中出现拼写错误。Mateusz Kubuszok,已修复。另外,我试图解决的问题在“请看完整的场景”中说明。您所解释的代码绝对不会终止。对于完整的场景,请查看完整的场景。您所解释的代码绝对不会终止。有关完整场景,请参见