消费者池的自动缩放

Epc*_*lon 1 java multithreading producer-consumer

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

我们希望这样做,以便当用户触发请求时,它会被添加到队列中,然后许多工作线程将获取每个请求并进行轮询,同时用户执行其他操作.

由于请求的数量在白天变化很大,我们认为在很慢的情况下让很多工人无所事事会浪费资源,但与此同时我们需要有足够的工人来处理高峰负荷.系统.

当有很多请求在等待时,我们希望能够增加更多工作人员,但在没什么可做的时候就会杀掉工人.

可以使用EJB执行此操作,但我们不想使用它.我们也不想使用JMS或其他大型框架来处理这个问题,除非我们已经在使用它(Spring,Quartz,很多Apache的东西).

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

cle*_*tus 7

ThreadPoolExecutor对核心和最大池大小使用适当的值.

请记住,虽然有几百个空闲线程没有巨大的成本,所以你可以考虑使用Executors.newFixedThreadPool().