池大小如何实际与Spring的计划任务一起使用?

时间:2012-04-20 18:12:04

标签: java spring scheduled-tasks threadpool

我的任务安排如下:

<task:scheduler id="notification.scheduler" pool-size="15" />

<task:scheduled-tasks scheduler="notification.scheduler">
    <task:scheduled ref="notificationProcessor" method="sendNextQueueEvent" fixed-rate="500" />
    <task:scheduled ref="notificationProcessor" method="deleteNextCompletedEvent" fixed-rate="60000" />
</task:scheduled-tasks>

我认为我对计划任务如何处理池大小有误解。尽管池大小为15,但似乎只使用了一个线程。例如,如果队列中有15个事件,我认为每分钟会有15个线程检查从队列中删除事件。显然,这是错误的。

我怎样才能使用Spring的调度程序抽象在15个线程中调用此方法的时间间隔?

编辑:我想要完成的是:每半秒,我想检查是否有排队的事件要发送。完成后,我想发送最多15个(如果存在15个)。我如何使用java线程的弹簧抽象来完成这个?

2 个答案:

答案 0 :(得分:5)

首先,<task:scheduler/>ScheduledThreadPoolExecutor扩展ThreadPoolExecutor的包装器。后者的JavaDoc说:

  

甚至核心线程最初只在新任务到达时创建并启动

其次,您必须了解计划任务(这是Java功能,而不是Spring的功能)不会同时运行,即使它们花费的时间比重复间隔长。他们只是等待。所以你没有15个事件在队列中等待,你有15个执行迟到并等待那个单线程。无需创建另一个,因为下一次执行必须等待前一个完成。同样,这就是Java调度框架的工作原理。

当然,如果你安排了几个不同的任务,将会创建更多的线程。

答案 1 :(得分:3)

Spring的task:scheduler默认是java.util.concurrent.ThreadPoolExecutor的bean属性包装器:

  

corePoolSize - 池中保留的线程数,即使它们也是如此   闲着。

这并不能保证pools-size属性等同于具有该数量的活动线程。另一方面,您应该注意,在任何给定的时间点,只有最大数量的线程等于您正在使用的机器上的处理核心;即所有其他线程将等待切换到RUNNING模式并继续执行。

此外,在Spring的文档中,它提到如果这不是您所需要的,您还可以利用ConcurrentTaskExecutor