如何在单独的线程中处理文件?

时间:2016-01-18 16:33:09

标签: multithreading spring-integration

如何在单独的线程中处理文件?

有一个/ local目录,其中文件通过其他方式放置,具有相同名称的新文件替换旧文件。 我想从/ local移动文件到/处理目录并激活一些服务。此外,在过滤器链的末尾,清理任务将从/处理中删除文件。 我让它一个接一个地工作,但处理需要几分钟,所以我想

  1. 添加多线程:即同时移动和处理多个文件。

  2. 如果有一个尚未处理的文件说“File1.abc”并且该文件的新版本已经放入/ local,则无需使用旧版本的文件处理旧消息。即消息应仅在文件版本从/ local移动到/处理

  3. 时发送

    我正在尝试这样的事情:

    <file:inbound-channel-adapter channel="processingChannel"
                                   directory="#{localDir}"
                                   prevent-duplicates="false" filter="acceptAllFileListFilter">
        <int:poller fixed-rate="20" max-messages-per-poll="3" task-executor="executor"/>
    </file:inbound-channel-adapter>
    
    <task:executor id="executor" pool-size="3" queue-capacity="0" rejection-policy="ABORT"/>
    
    <file:outbound-gateway      request-channel="processingChannel"   reply-channel="serviceChannel"
                                   directory="#{processing}"
                                   auto-create-directory="true"
                                   filename-generator-expression="payload.name + '_' + { T(java.lang.System).currentTimeMillis()}"
                                   delete-source-files="true"
                                   mode="FAIL" />
    
    <int:service-activator input-channel="serviceChannel" output-channel="furtherChannels"
                           ref="someService" method="process">
    </int:service-activator>
    
    <bean id="someService" class="com.dot.SomeService"/>
    

    但它不起作用,我无法弄清楚如何解决它。我尝试了不同的方法,但总会出现错误,例如为已经删除的文件生成消息或其他一些问题。任务本身似乎很简单。如何在3个线程中处理文件并仅为实际版本的文件发送消息?轮询消费者可能有问题,但入站适配器仅用于此消费者,对吗?

1 个答案:

答案 0 :(得分:1)

我还没有看到你的解决方案,但也许你没有正确解释这个挑战......试着分享业务需求。

另外,我看不出<file:outbound-gateway>的原因。您只需从/local目录中读取文件并进行处理即可。对于并发和一些丢弃的飞行中进程逻辑,您可以使用一些自定义FileListFilter,您应该从中确定新文件版本,并通过其键cancel()运行进程以启动新文件版本当前结束poll()

可能还有其他一些解决方案,但让我们从业务需求开始吧!