由于接收超时和任务执行器不协调而导致内存泄漏

我正在浏览 spring 集成参考文档,在第 10.1.8 节异步轮询中,它写道,不协调的 conf 可能会导致内存泄漏。

根据下面的文档,conf 不协调:

<int:channel id="publishChannel">

    <int:queue />

</int:channel>

<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" />

我在理解本节时遇到困难,因为它写的是每秒将执行 4 个线程,因为每个线程将等待 250 毫秒,并且任务将以每秒 20 个的速度添加。


任务执行器是否应该只分配 1 个线程来等待传入消息,并且应该启动最大线程以防队列中有足够的任务?另外,为什么每秒只有 4 个线程执行,如果任务花费超过 250 毫秒怎么办?


如果它太简单并且我错过了一些微不足道的东西,请道歉。


江户川乱折腾
浏览 76回答 1
1回答

潇湘沐

这<task:executor id="taskExecutor" pool-size="20" />是一个无界的任务队列。这是默认的。这task-executor="taskExecutor" fixed-rate="50"意味着不会阻塞调度程序的线程,并且调度程序每 50 毫秒启动一次新的轮询!它的发生确实与publishChannel内容无关。我的意思是新任务总是被放入taskExecutor队列中。如果下游进程确实足够长,则20执行器的所有线程都会很忙,并且任务的内部队列将会增长。这就是内存泄漏最严重的地方。1 秒/ 50 毫秒 = 每秒 20 个任务。如果 中没有消息publishChannel,我会说任务执行器中的所有线程都将忙于等待 5 秒超时。那么,任务的完成率是多少呢?20 active tasks / 5000 millis to wait for their finish = 4 per second。这个故事与4 个线程无关,而是在实际情况下我们能够以多快的速度耗尽任务队列。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java