我正在尝试解决必须实现目标的特定问题- 1)有一个过程部分,包括验证,数学计算和发送消息,仅当验证成功时才需要进行数学计算,类似地,只有在数学计算完成后才需要发送消息。 2)但我不能在此处编写阻塞代码,因为这是过程所花的时间,因此我为每个过程使用不同的执行上下文,并在将来进行链接
因此,我为application.config中的每个进程定义了不同的线程池
contexts {
simple-db-lookups {
executor = "thread-pool-executor"
throughput = 1
thread-pool-executor {
fixed-pool-size = 20
}
}
expensive-db-lookups {
executor = "thread-pool-executor"
throughput = 1
thread-pool-executor {
fixed-pool-size = 20
}
}
db-write-operations {
executor = "thread-pool-executor"
throughput = 1
thread-pool-executor {
fixed-pool-size = 10
}
}
并通过控制器调用一个外观,而该外观反过来又使用了全面的外观
for{
result1 <- future1(call to validation)
result2 <- future2(result1) call to mathematical operation
} yield(result2)
即使在数学运算调用中,我也使用相同的构造
future2(result1){
result1 <- anotherMethodCallForMaths()
result2 <- messagingCall(result1) //last future call
}
anotherMethodCallForMaths{
implicit lazy val executionContext = <context for math op>
Future{
logic
}(executionContext)
}
每种方法(messagingCall,anotherMethodCallForMaths和将来的验证调用)都使用它们自己的执行上下文,这样就不会有两个作业使用同一线程池
现在,当我执行测试时,从日志中可以清楚地看到
将来对验证和anotherMethodCallForMaths的调用正确地使用了在线程池中配置的线程数,而消息传递调用使用的是正确的线程池,但不限于所提及的线程数,并且正在使用/创建的线程数超过配置的数量线程。
这可能是问题所在,我已经尝试了多种方法来达到相同的目的,但目前尚无解决方法。