1

我们有一个 Web 应用程序,可以让用户触发对外部资源的请求。外部资源花费未指定的时间来收集结果,因此我们必须轮询它以获取更新,并在完成后收集最终结果。

我们希望这样当用户触发请求时,它会被添加到队列中,然后许多工作线程将接收每个请求并进行轮询,而用户则执行其他操作。

由于一天中的请求数量变化很大,我们认为让大量工作人员在速度很慢时什么都不做会浪费资源,但同时我们需要有足够的工作人员来处理峰值负载系统。

我们希望可以在有大量请求等待时添加更多工作人员,但在无事可做时杀死工作人员。

使用 EJB 可以/可以做到这一点,但我们不想使用它。我们也不想使用 JMS 或其他大型框架来处理这个问题,除非它是我们已经在使用的框架(Spring、Quartz、很多 Apache 的东西)。

由于 EJB 对此提供支持,并且它是那里发现的更有用的特性之一,我们想象有人已经为我们解决了这个问题。建议?

4

2 回答 2

7

使用ThreadPoolExecutor具有适当值的核心和最大池大小。

请记住,拥有数百个空闲线程的成本并不高,因此您可以考虑仅使用Executors.newFixedThreadPool().

于 2009-09-24T12:59:01.827 回答
1

java.util.concurrent.ThreadPoolExecutor文档中:

如果池当前有多个 corePoolSize 线程,多余的线程如果空闲时间超过 keepAliveTime(请参阅 getKeepAliveTime(java.util.concurrent.TimeUnit))将被终止。这提供了一种在池没有被积极使用时减少资源消耗的方法。如果池稍后变得更加活跃,则将构造新线程。

所以,我建议你先试试 Java 标准库。您将不得不稍微调整参数,但线程池是高度可配置的。

于 2009-09-24T13:07:18.463 回答