Spring Integration - 如果Poller和TaskExecutor没有调整,那么内存泄漏

时间:2015-07-30 09:03:40

标签: spring-integration executorservice threadpoolexecutor poller

在Spring Integration doc的以下7.1.7异步轮询部分中,如果解释了Poller和TaskExecutor不协调,则可能发生内存泄漏。但我不明白。

http://docs.spring.io/autorepo/docs/spring-integration/3.0.x/reference/html/messaging-endpoints-chapter.html#async-polling

<int:service-activator input-channel="publishChannel" ref="myService">
    <int:poller receive-timeout="5000" task-executor="taskExecutor" fixed-rate="50"/>
</int:service-activator>

<task:executor id="taskExecutor" pool-size="20" queue-capacity="20"/>

以上配置演示了其中一种失调配置。

  

即使所有线程都是,轮询器仍会继续安排新任务   阻止等待新消息到达或超时到达   到期。鉴于有20个线程执行任务5   第二次超时,它们将以每秒4次的速度执行   (5000/20 = 250ms)。但是,新任务的安排速度为20   每秒,因此任务执行器中的内部队列将增长到   速率为每秒16(当进程空闲时),所以我们基本上   有内存泄漏。

     

处理此问题的方法之一是设置queue-capacity属性   &gt;任务执行器为0。

有人可以详细说明。

以下是我对上述代码的理解:

pool-size是20 - 所以将执行20个线程。

receive-timeout是5秒:因此20个线程将被给予5秒完成任务。

固定费率为50毫秒 - 所以新任务的安排速度为每秒20个。

我几乎没有问题:

Q值。如果执行20个线程需要5秒以上会发生什么?

Q值。在文档中,其所述任务将以每秒4个的速率执行。但是,有些任务可能在不到4秒的时间内完成,有些任务需要更长的时间。

Q值。它是如何导致内存泄漏的?如果没有可用的线程和队列,Executor会根据拒绝策略拒绝它。

Q值。如何将queue-capacity设置为0有帮助?根据我的理解,如果所有线程都忙,那么Executor会将它们放入队列,直到它达到队列容量。

1 个答案:

答案 0 :(得分:0)

文档不正确 - 只有当您拥有无限制队列并且消息处理无法跟上时才会发生内存泄漏。我打开了一个JIRA Issue来纠正它。