我们有一个网络应用程序,可以让用户触发对外部资源的请求。外部资源花费不确定的时间来收集结果,因此我们必须对其进行轮询以获取更新,并在完成后收集最终结果。
我们希望这样当用户触发请求时,它会被添加到队列中,然后许多工作线程将接收每个请求并进行轮询,同时用户做其他事情。
由于一天中请求的数量变化很大,我们认为在缓慢时让很多工作人员无所事事会浪费资源,但同时我们需要有足够的工作人员来处理高峰期在系统上加载。
我们希望有一些东西可以在有很多请求等待时添加更多的 worker ,但在没有什么可做的时候杀死 worker 。
可以/曾经可以使用 EJB 来做到这一点,但我们不想使用它。我们也不想使用 JMS 或其他大型框架来处理这个问题,除非它是我们已经在使用的框架(Spring、Quartz、许多 Apache 的东西)。
由于 EJB 对此有支持,并且它是其中发现的更有用的功能之一,我们认为有人已经为我们解决了这个问题。有什么建议吗?
最佳答案
使用 ThreadPoolExecutor
为核心和最大池大小设置适当的值。
请记住,拥有数百个空闲线程的成本并不高,因此您可以考虑只使用 Executors.newFixedThreadPool()
.
关于java - 消费者池的自动缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1471495/