Java 用户池的自动缩放

Java 用户池的自动缩放,java,multithreading,producer-consumer,Java,Multithreading,Producer Consumer,我们有一个web应用程序,允许用户触发对外部资源的请求。外部资源花费了未指定的时间来收集结果,因此我们必须轮询它以获取更新,并在更新完成后收集最终结果 我们希望这样做,当用户触发请求时,它被添加到队列中,然后许多工作线程将接收每个请求并进行轮询,而用户则进行其他操作 由于请求的数量在一天中变化很大,我们认为在速度较慢时让大量的工作人员无所事事是一种资源浪费,但同时我们需要有足够的工作人员来处理系统上的峰值负载 我们希望能够在有大量请求等待时添加更多的工人,但在没有什么事情可做时杀死工人 使用EJ

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

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

由于请求的数量在一天中变化很大,我们认为在速度较慢时让大量的工作人员无所事事是一种资源浪费,但同时我们需要有足够的工作人员来处理系统上的峰值负载

我们希望能够在有大量请求等待时添加更多的工人,但在没有什么事情可做时杀死工人

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

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

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

记住,在有几百个空闲线程的情况下不需要花费巨大的代价,所以你可以考虑只使用。

使用一个具有适当值的内核和最大池大小。

尽管有几百个空闲线程没有花费巨大的代价,所以你可以考虑使用。

< P>从:

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

因此,我建议您首先尝试Java标准库。您必须稍微调整参数,但线程池是高度可配置的。

来自:

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

因此,我建议您首先尝试Java标准库。您必须稍微调整参数,但是线程池是高度可配置的