【发布时间】:2012-06-15 09:29:46
【问题描述】:
我目前正在从事一个涉及大量独立运行的异步任务的项目。我有一个 spring 配置文件。
<task:executor id="taskScheduler" pool-size="5-20">
<task:executor id="specificTaskScheduler" pool-size="5-50" queue-capacity="100">
<!-- integration beans and
several object pools, with a total number of 100 beans created
using CommonsPoolTargetSource -->
我专门创建了两个执行器 - 一个用于 Spring 集成需求和自定义执行器,以便它仅运行我的任务,将其提供给具有显式引用的集成 bean。之后,我提供了一个需要处理的长时间运行的任务。我的 EAR 在 WebLogic 上运行,并且我转储了正在运行的线程的堆栈跟踪,并且非常失望地发现我的自定义执行程序中的 50 个线程中的大多数在执行程序的队列中等待从池中可用的对象。我不希望 CommonsPoolTargetSource 将我的执行程序用作管理其来源的平台。我可以在这里做什么?也许用 CommonsTargetSource bean 创建一个单独的 spring 文件可以解决它?感谢您的任何想法。
【问题讨论】:
-
我不确定这是否是因素,但要记住的一件事是,当您分配线程池时(我假设
ThreadPoolExecutor正在支持调度程序),它会将作业添加到队列,在使用非核心线程之前。这完全至少对我来说是违反直觉的。 -
格雷的评论似乎是正确的。顺序基本上是:1)使用核心线程 2)如果没有足够的核心线程,则添加到队列中,3)如果队列已达到容量,则通过添加新线程(最多)来增加池......然后这些添加的线程可以超时并根据空闲时间设置再次删除。
标签: java multithreading spring spring-aop spring-integration