为什么 Akka 在没有任务时关闭调度程序?



我想用曾经创建的线程固定线程池。因此,我创建了自己的ExecutorServiceConfigurator

class FixedThreadPoolExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) {
class ThreadPoolExecutorServiceFactory extends ExecutorServiceFactory {
def createExecutorService: ExecutorService = {
Executors.newFixedThreadPool(40)
}
}
private val executor = new ThreadPoolExecutorServiceFactory()
override def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = {
executor
}
}

并使用它:

blocking-dispatcher {
type = Dispatcher
executor = "abc.FixedThreadPoolExecutorServiceConfigurator"
throughput = 1
thread-pool-executor {
fixed-pool-size = 60
}
}

但是每次,当我的程序没有任何任务时,Akka 都会关闭ExecutorService

akka.dispatch.MessageDispatcher:

private val shutdownAction = new Runnable {
@tailrec
final def run(): Unit = {
shutdownSchedule match {
case SCHEDULED ⇒
try {
if (inhabitants == 0) shutdown() //Warning, racy
} 
////// 
}
}
}

我无法理解这种行为。我认为,创建线程是昂贵的操作。

当执行程序用完任务时,它不会停止执行程序。仅当该调度程序的最后一个参与者停止并且超时已过(shutdown-timeout调度程序配置)且未启动分配给调度程序的新参与者时,才会运行关闭。

对于调度程序具有许多短暂生存期的参与者且没有执行器运行的时间段>默认值的用例,您可以将设置调整为更高的值以保持执行程序的活动状态。

您可以粘贴在没有可用任务时终止的主应用程序代码吗?

如果您正在创建ActorSystem则除非您终止它,否则您的应用程序将不会退出,因为它确实会创建一些用户线程来保持应用程序运行。

相关内容

  • 没有找到相关文章

最新更新