如何配置HTTP阿卡特定的调度?

问题描述 投票:1回答:1

我有简单的阿卡HTTP应用程序,它使用的WebSocket。我的请求处理有阻塞调用(如,JDBC)。所以,我需要使用一些固定大小的线程池这样的代码工作。

所以,按照我的理解,我应该使用application.conf(这样的 - https://github.com/mkuthan/example-akka-http/blob/master/src/main/resources/application.conf)。但我不知道,如何配置自定义的线程池不断固定线程。

当我运行我的应用程序并执行线程转储,我会见到两个名字:

  • 阿卡系统-akka.actor.default-调度-62
  • 路线 - akka.actor.default-调度-79

我不明白,什么是它这些线程池。

我试图建立默认线程池,如下所示:

akka {
  actor {
    default-dispatcher {
      type = Dispatcher
      executor = "thread-pool-executor"
      thread-pool-executor {
        fixed-pool-size = 40
      }
    }
  }
}

它的工作原理非常奇怪:

multithreading scala akka threadpool akka-http
1个回答
2
投票

你可能开始两个独立ActorSystems有两个名字qazxsw POI和POI qazxsw,因为这样你看到两种类型的日志线程的名字。

akka-system-akka是Java运行时定义Routes-akka,它不是FixedThreadPool。

甲的ThreadPoolExecutor将自动调整池大小(见getPoolSize())根据由corePoolSize设定的界限(参见getCorePoolSize())和maximumPoolSize(参见getMaximumPoolSize())。当一个新的任务,方法提交执行(Runnable接口),而且比corePoolSize线程较少的运行,创建一个新的线程来处理请求,即使其他辅助线程是空闲的。如果不是maximumPoolSize线程运行有超过corePoolSize,但少,一个新的线程将被创建仅当队列已满。通过设置corePoolSize和maximumPoolSize相同,您可以创建一个固定大小的线程池。通过maximumPoolSize设置为基本的无界值,如Integer.MAX_VALUE的,你让池,以适应并发任务的任意数目。最典型的,核心和最大池大小仅基于结构设置,但也可以使用setCorePoolSize(int)和setMaximumPoolSize(INT)动态地改变。

所以,你可以看到它比定义的大小更少开始,增加了它根据传入的任务线程数。

阅读thread-pool-executor解释线程是如何终止部分。

即将于手头的问题:

不要覆盖ThreadPoolExecutor因为它是被使用的阿卡用于其他目的,即通过执行消息发送给所有的演员,这样就可以很容易地配置错误。而且,最重要的是,不要运行在默认调度(读Keep-alive times有详细介绍)阻塞的任务。相反,引入独立的调度和执行有你的阻塞代码。

下面是一个例子,如何与普通的HTTP请求(对不起,我没有使用过网络插座前)做

default-dispatcher

akka docs必须类似于您 val asyncHandler: HttpRequest => Future[HttpResponse] = { req => val blockingExecutionContext = system.dispatchers.lookup("blocking-dispatcher") Future { // blocking call HttpRespone(???) }(blockingExecutionContext) // this can be passed implicitly too } Http().bindAndHandleAsync(asyncHandler, "localhost") 做了什么blocking-dispatcher进行配置,但它在配置文件中的根定义。

application.conf

在一般情况下,您的隔离封锁执行到,你可以为这种类型的阻塞操作的具体配置单独的执行上下文。作为类型的执行任务是有限的,由你掌控更容易微调这样的做法。

© www.soinside.com 2019 - 2024. All rights reserved.