Spring集成文件轮询。如果移动文件确实需要使用AcceptOnceFileListFilter?

时间:2015-02-04 11:23:42

标签: multithreading spring spring-integration file-processing

我正在编写文件轮询实现,并且正在尝试确定是否需要使用AcceptOnceFileListFilter。 FileProcessor将执行的第一步是将文件移动到另一个目录。

poller" batchFilePoller&#34>轮询时使用多个线程?可以在多个线程读取文件的情况下发生竞争条件吗?在这种情况下,我假设我需要使用AcceptOnceFileListFilter。

但是,如果轮询器仅使用池中的一个线程。 然后,如果文件在下一个轮询时间之前移动并且成功,我假设文件没有被处理过两次?

<int-file:inbound-channel-adapter id="batchFileInAdapter" directory="/somefolder" auto-create-directory="true" auto-startup="false" channel="batchFileInChannel" >
    <int:poller id="batchFilePoller" fixed-rate="6000" task-executor="batchTaskExecutor" max-messages-per-poll="1" error-channel="batchPollingErrorChannel" />
</int-file:inbound-channel-adapter>

<int:channel id="batchFileInChannel"/>

<int:service-activator input-channel="batchFileInChannel" >
    <bean class="com.foo.FileProcessor" />
</int:service-activator>

<task:executor id="batchTaskExecutor" pool-size="5" queue-capacity="20"/>

1 个答案:

答案 0 :(得分:2)

<int-file:inbound-channel-adapter>prevent-duplicates选项,默认情况下为true,因为您没有提供任何阻止prevent-duplicates为{{{}的其他选项1}}。

是的:如果使用true,任何轮询适配器都是多线程的。在这种情况下,新的轮询任务可以在前一个完成之前运行。

即使它是单线程(使用fixed-rate),fixed-delay必须在那里,因为新的轮询任务不知道文件是否已被处理。它再次读取同一个文件。

AcceptOnceFileListFilter完全适用于您不想再次阅读同一文件的情况。对于AcceptOnceFileListFilter的{​​{1}},您可以使用<int:transactional synchronization-factory=""/>克服该问题:

<poller>

<int-file:inbound-channel-adapter>

您可以在Spring Integration Reference Manual中找到更多信息。