这是我们的春季配置:
<int-file:inbound-channel-adapter id="fileReprocessorChannelId" channel="fileReprocessorChannel"
directory="${file.location}" scanner="headScanner">
<int:poller cron="${reprocess.cronExpression}" max-messages-per-poll="${reprocess.maxMsgPerPoll}" />
</int-file:inbound-channel-adapter>
<int:chain id="reprocessorChain" input-channel="fileReprocessorChannel" output-channel="transformerChannel">
<int-file:file-to-string-transformer delete-files="false" charset="UTF-8" />
<int:header-enricher>
<int:header name="Operation" value="${operation.fileReprocessor}" overwrite="true" />
<int:header name="GUID" method="getGuidForReprocessing" ref="headerAttributesGenerator"/>
</int:header-enricher>
</int:chain>
<bean id="headScanner" class="FileStreamDirectoryScanner">
<constructor-arg>
<value>${reprocess.maxMsgPerPoll}</value>
</constructor-arg>
<constructor-arg>
<value>${reprocess.fileAgeInMillis}</value>
</constructor-arg>
<property name="locker" ref="nio-locker" />
</bean>
<bean id="nio-locker" class="org.springframework.integration.file.locking.NioFileLocker" />
<int:channel id="transformerChannel">
<int:interceptors>
<int:wire-tap channel="loggerChannel"/>
</int:interceptors>
</int:channel>
在磁盘上运行大约10000个文件的服务器时,我们会在处理大约7000个文件时发现以下异常: java.nio.file.FileSystemException:打开的文件过多。
大量的线程占用了大约70个线程的大型CPU,导致应用程序崩溃。
如果有更好的方法(我们做错了吗?)或者如果这是春季代码中的已知错误,请您提出建议吗?
编辑:
答案 0 :(得分:0)
如果文件在几个目录中,我建议改为WatchService。这可能会导致一个线程,但对于目录,而不是目录中的每个文件。
答案 1 :(得分:0)
默认taskExecutor
是SyncTaskExecutor
,因此任务在调度程序线程上运行。
默认的taskScheduler
bean只有10个线程,所以你必须有一些你没有显示的其他配置。
您是否查看了线程转储(jstack pid
)以查看所有这些线程正在做什么?