如何在单独的线程中处理文件?
有一个/ local目录,其中文件通过其他方式放置,具有相同名称的新文件替换旧文件。 我想从/ local移动文件到/处理目录并激活一些服务。此外,在过滤器链的末尾,清理任务将从/处理中删除文件。 我让它一个接一个地工作,但处理需要几分钟,所以我想
添加多线程:即同时移动和处理多个文件。
如果有一个尚未处理的文件说“File1.abc”并且该文件的新版本已经放入/ local,则无需使用旧版本的文件处理旧消息。即消息应仅在文件版本从/ local移动到/处理
我正在尝试这样的事情:
<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个线程中处理文件并仅为实际版本的文件发送消息?轮询消费者可能有问题,但入站适配器仅用于此消费者,对吗?
答案 0 :(得分:1)
我还没有看到你的解决方案,但也许你没有正确解释这个挑战......试着分享业务需求。
另外,我看不出<file:outbound-gateway>
的原因。您只需从/local
目录中读取文件并进行处理即可。对于并发和一些丢弃的飞行中进程逻辑,您可以使用一些自定义FileListFilter
,您应该从中确定新文件版本,并通过其键cancel()
运行进程以启动新文件版本当前结束poll()
。
可能还有其他一些解决方案,但让我们从业务需求开始吧!