在Spring Integration doc的以下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"/>
以上配置演示了其中一种失调配置。
即使所有线程都是,轮询器仍会继续安排新任务 阻止等待新消息到达或超时到达 到期。鉴于有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会将它们放入队列,直到它达到队列容量。