使用spring integration

时间:2017-01-11 20:59:30

标签: java spring multithreading spring-integration

这是我们的春季配置:

    <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:打开的文件过多。

在调试代码时,似乎在这里创建了线程:https://github.com/spring-projects/spring-integration/blob/master/spring-integration-core/src/main/java/org/springframework/integration/endpoint/AbstractPollingEndpoint.java#L334

大量的线程占用了大约70个线程的大型CPU,导致应用程序崩溃。

如果有更好的方法(我们做错了吗?)或者如果这是春季代码中的已知错误,请您提出建议吗?

编辑:

  1. 附加的线程转储: Thread dump

2 个答案:

答案 0 :(得分:0)

如果文件在几个目录中,我建议改为WatchService。这可能会导致一个线程,但对于目录,而不是目录中的每个文件。

答案 1 :(得分:0)

默认taskExecutorSyncTaskExecutor,因此任务在调度程序线程上运行。

默认的taskScheduler bean只有10个线程,所以你必须有一些你没有显示的其他配置。

您是否查看了线程转储(jstack pid)以查看所有这些线程正在做什么?