我有简单的阿卡HTTP应用程序,它使用的WebSocket。我的请求处理有阻塞调用(如,JDBC)。所以,我需要使用一些固定大小的线程池这样的代码工作。
所以,按照我的理解,我应该使用application.conf(这样的 - https://github.com/mkuthan/example-akka-http/blob/master/src/main/resources/application.conf)。但我不知道,如何配置自定义的线程池不断固定线程。
当我运行我的应用程序并执行线程转储,我会见到两个名字:
我不明白,什么是它这些线程池。
我试图建立默认线程池,如下所示:
akka {
actor {
default-dispatcher {
type = Dispatcher
executor = "thread-pool-executor"
thread-pool-executor {
fixed-pool-size = 40
}
}
}
}
它的工作原理非常奇怪:
你可能开始两个独立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
在一般情况下,您的隔离封锁执行到,你可以为这种类型的阻塞操作的具体配置单独的执行上下文。作为类型的执行任务是有限的,由你掌控更容易微调这样的做法。