我想使用SI将数据导入我的应用程序,从XML文件中读取它。我对这项技术还比较陌生,但想想,它可能非常适合我的用例。
我一定需要注意订单,这意味着当有人放入5个文件时,我需要先导入一些文件,然后导入一些文件。这很重要。
为简单起见,我想说我有两种类型的文件,比如A
和B
。
我使用比较器维持顺序:
<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
并将其置于内部队列中。只有在处理完整个队列后,它才会再次查看该文件夹并重做该过程。这是真的?
我怎样才能改变这一点并实现我想要的结果?
答案 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>