为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

江户川乱折腾 2023-07-13 13:57:01
我正在浏览 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 个线程无关,而是在实际情况下我们能够以多快的速度耗尽任务队列。


查看完整回答
反对 回复 2023-07-13
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信