【问题标题】:Several task executors in spring integrationspring集成中的几个任务执行器
【发布时间】: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


【解决方案1】:

谢谢各位。结果证明池不是问题,我只需要向它添加更多实例并稍微增加池大小,队列容量设置为零,拒绝策略设置为在调用者线程中执行调用。不过,我还没有在重负载下对其进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多