如何在Akka调度程序中使用自定义执行程序

Pau*_*per 4 scala executorservice akka

我正在尝试为Akka中的调度程序使用自定义执行程序。

具体来说,我想用我自己的(日志,调试等)包装一个现有的执行器。

我看了文档的相关部分:

可以配置默认的调度程序,默认情况下是带有“ fork-join-executor”的Dispatcher,在大多数情况下,该调度程序都具有出色的性能。

使用“执行程序”指定,使用“ fork-join-executor”,“线程池执行程序”或akka.dispatcher.ExecutorServiceConfigurator的FQCN

(我不知道什么是FQCN。)

我该怎么做呢?

Vik*_*ang 5

FQCN ==完全合格的类名称,即包名称+类名称,例如:

java.lang.String <-字符串的FQCN

这是内置ThreadPoolExecutor的ExecutorServiceConfigurator的示例:

class ThreadPoolExecutorConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) {

  val threadPoolConfig: ThreadPoolConfig = createThreadPoolConfigBuilder(config, prerequisites).config

  protected def createThreadPoolConfigBuilder(config: Config, prerequisites: DispatcherPrerequisites): ThreadPoolConfigBuilder = {
    import akka.util.Helpers.ConfigOps
    ThreadPoolConfigBuilder(ThreadPoolConfig())
      .setKeepAliveTime(config.getMillisDuration("keep-alive-time"))
      .setAllowCoreThreadTimeout(config getBoolean "allow-core-timeout")
      .setCorePoolSizeFromFactor(config getInt "core-pool-size-min", config getDouble "core-pool-size-factor", config getInt "core-pool-size-max")
      .setMaxPoolSizeFromFactor(config getInt "max-pool-size-min", config getDouble "max-pool-size-factor", config getInt "max-pool-size-max")
      .configure(
        Some(config getInt "task-queue-size") flatMap {
          case size if size > 0 ?
            Some(config getString "task-queue-type") map {
              case "array"       ? ThreadPoolConfig.arrayBlockingQueue(size, false) //TODO config fairness?
              case "" | "linked" ? ThreadPoolConfig.linkedBlockingQueue(size)
              case x             ? throw new IllegalArgumentException("[%s] is not a valid task-queue-type [array|linked]!" format x)
            } map { qf ? (q: ThreadPoolConfigBuilder) ? q.setQueueFactory(qf) }
          case _ ? None
        })
  }

  def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory =
    threadPoolConfig.createExecutorServiceFactory(id, threadFactory)
}
Run Code Online (Sandbox Code Playgroud)

来源:https : //github.com/akka/akka/blob/v2.3.4/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala#L344