Spring集成:在每个已处理的文件之后始终维护订单

时间:2018-05-08 14:01:21

标签: spring-integration

我想使用SI将数据导入我的应用程序,从XML文件中读取它。我对这项技术还比较陌生,但想想,它可能非常适合我的用例。

我一定需要注意订单,这意味着当有人放入5个文件时,我需要先导入一些文件,然后导入一些文件。这很重要。

为简单起见,我想说我有两种类型的文件,比如AB。 我使用比较器维持顺序:

<int-file:inbound-channel-adapter id="someId"
        directory="file:${folderPath}"
        filter="myFilter"
        auto-startup="true"
        comparator="myFileComparator">
    <int:poller fixed-rate="1000" time-unit="MILLISECONDS" max-messages-per-poll="1" />
</int-file:inbound-channel-adapter>

到目前为止,这么好,就像意图一样。如果我在A B B A B中放入5个文件,则按A A B B B的顺序导入。

但现在考虑以下方案:当SI处理A A B并且已经开始处理第二个B时,我决定引入另一个A文件。 这意味着现在已经在进行中了B,加上旧的 - B和新的A。我希望下一次导入应该是已经在进行中的新A - B完成。导致A A B B A B。 (A A B B在添加新文件之前已经“设置”了,A B之后需要维护订单。

但事实并非如此。结果是A A B B B A。在第一批文件之后,我的A被简单地抛出。

我猜,Spring只提取一次,最初看到A A B B B并将其置于内部队列中。只有在处理完整个队列后,它才会再次查看该文件夹并重做该过程。这是真的? 我怎样才能改变这一点并实现我想要的结果?

1 个答案:

答案 0 :(得分:1)

您需要启用scan-each-poll选项:

 <xsd:attribute name="scan-each-poll" default="false">
            <xsd:annotation>
                <xsd:documentation>
                    Set this flag if you want to make sure the internal queue is
                    refreshed with the latest content of the input directory on each poll.
                </xsd:documentation>
            </xsd:annotation>
            <xsd:simpleType>
                <xsd:union memberTypes="xsd:boolean xsd:string"/>
            </xsd:simpleType>
        </xsd:attribute>