有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java内存泄漏,因为接收超时和任务执行器不协调

我正在阅读spring集成参考文档,在第10.1.8 Asynchronous Polling节中,有人写道,不协调的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的速度添加

任务执行器不应该只分配一个线程来等待传入消息,并且应该启动最大线程数,以防队列中有足够的任务吗?还有,为什么每秒只执行4个线程?如果任务需要超过250毫秒怎么办

如果事情太简单,我遗漏了一些琐碎的东西,我会道歉


共 (1) 个答案

  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个线程,而是在值得的情况下,我们能够以多快的速度耗尽任务队列