Spring 集成 - 如果 Poller 和 TaskExecutor 不协调则内存泄漏
Spring Integration - If Poller and TaskExecutor are not in tune then memory leak
在下面Spring集成文档的7.1.7异步轮询部分,解释了如果Poller和TaskExecutor不协调可能会发生内存泄漏。但是没看懂
<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更正一下
在下面Spring集成文档的7.1.7异步轮询部分,解释了如果Poller和TaskExecutor不协调可能会发生内存泄漏。但是没看懂
<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更正一下