我正在浏览 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 毫秒怎么办?如果它太简单并且我错过了一些微不足道的东西,请道歉。
1 回答
潇湘沐
TA贡献1816条经验 获得超6个赞
这<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 个线程无关,而是在实际情况下我们能够以多快的速度耗尽任务队列。
添加回答
举报
0/150
提交
取消