如何在文件适配器的 Spring Integration TaskExecutor 中正确设置线程池和 maxMessagePerPoll 以避免堆问题

问题描述 投票:0回答:1

我一直遇到两个问题,不知道如何解决。

  1. 超出GC开销限制(堆空间不足,应用程序当前使用2GB)
  2. 应用程序暂停ThreadPoolExecutor池大小= 50,活动线程= 50,排队任务= 50

根据我的理解,每个消息轮询需要 1 个线程。我将任务执行器池大小设置为 50,并将文件适配器设置为每次轮询最多 25 条消息的固定速率。那么,如果最多使用 50 个线程中的 25 个,问题 2) 会如何发生?

我还使用事务管理器/同步工厂在处理后删除每个文件。这对上面有影响吗?

spring-integration
1个回答
0
投票

不,逻辑是这样的:

            this.taskExecutor.execute(() -> {
                int count = 0;
                while (this.initialized && (this.maxMessagesPerPoll <= 0 || count < this.maxMessagesPerPoll)) {
                    if (this.maxMessagesPerPoll == 0) {
                        logger.info("Polling disabled while 'maxMessagesPerPoll == 0'");
                        break;
                    }
                    if (pollForMessage() == null) {
                        break;
                    }
                    count++;
                }
            });

因此,整个

maxMessagesPerPoll
批次使用一个线程。显然您有太多文件需要从目录中提取。另外,听起来这些文件的处理速度太慢,无法在其中堆积任务。
我们需要查看更多配置和流程逻辑,以确定这些线程到底卡在哪里。您可以使用 JConsole 来观察那些内存泄漏和阻塞线程。

© www.soinside.com 2019 - 2024. All rights reserved.