Spring 集成 - 如果 Poller 和 TaskExecutor 不协调则内存泄漏

Spring Integration - If Poller and TaskExecutor are not in tune then memory leak

在下面Spring集成文档的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"/>

以上配置演示了其中一种不合时宜的配置。

The poller keeps scheduling new tasks even though all the threads are blocked waiting for either a new message to arrive, or the timeout to expire. Given that there are 20 threads executing tasks with a 5 second timeout, they will be executed at a rate of 4 per second (5000/20 = 250ms). But, new tasks are being scheduled at a rate of 20 per second, so the internal queue in the task executor will grow at a rate of 16 per second (while the process is idle), so we essentially have a memory leak.

One of the ways to handle this is to set the queue-capacity attribute of > the Task Executor to 0.

谁能详细说明一下。

以上代码是我的理解:

池大小为 20 - 因此将执行 20 个线程。

receive-timeout 为 5 秒:因此将给 20 个线程 5 秒来完成任务。

固定速率为 50 毫秒 - 因此正在以每秒 20 个的速率安排新任务。

我有几个问题:

问。如果执行20个线程需要超过5秒会怎样?

问。在文档中,它所说的任务将以每秒 4 个的速度执行。但是,有些任务可能 运行 不到 4 秒,有些则需要更多时间。

问。它是如何导致内存泄漏的?如果没有可用的线程和队列,执行器将根据拒绝策略拒绝它。

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

文档不正确 - 内存泄漏仅在您拥有无界队列且消息处理跟不上时才会发生。我开了一个JIRA Issue更正一下