简单的spring integration xml配置以读取ftp文件列表并进一步拆分

时间:2019-02-12 16:43:47

标签: spring-integration

我正在研究spring集成,并希望编写一个简单的应用程序以通过调度程序从ftp检索文件列表,并将其拆分为几个通道以进行并行处理。

但是无法理解如何从xml配置的调度程序中运行它,它将在出站时工作,而inbound1通道中应该有什么? (代码部分)

搜索了此类示例,但失败,阅读了参考文档

从文档参考中找到

<int-ftp:outbound-gateway id="gateway1"
    session-factory="ftpSessionFactory"
    request-channel="inbound1"
    command="ls"
    command-options="-1"
    expression="payload"
    reply-channel="toSplitter"/>

<int:channel id="inbound1"/>

   <int:inbound-channel-adapter id="i_hope_it_start_run_on_app_start"
                                             channel="inbound1"
                                             auto-startup="true">
       <int:poller fixed-rate="2000" max-messages-per-poll="10"/>
   </int:inbound-channel-adapter>

使用ftp中的计划运行检索文件列表来预期Spring Integration xml配置

1 个答案:

答案 0 :(得分:2)

实际上您是正确的:<int-ftp:outbound-gateway>LS命令确实为您返回了expression="payload"提供的远程目录中的文件列表。

您对<int:inbound-channel-adapter>的理解也是正确的:有了它,您真正启动了一个在每次触发活动时都要调用的任务。

您这里需要的是类似expression="'/YOUR_REMOTE_DIR'"的东西。因此,该表达式的结果作为有效内容发送到channel="inbound1"。这样便可以通过提到的expression="payload"在FTP网关中列出您的远程目录。

我不会使用fixed-rate="2000",因为没有理由同时轮询远程目录。应该考虑使用fixed-delay。同样,max-messages-per-poll="10"在这里也没有带来价值。您只需要在一个轮询任务上用/YOUR_REMOTE_DIR发送10次消息。将其配置为1,在<int:inbound-channel-adapter>的情况下为默认设置。

加上这种轮询逻辑,您将意识到您一直都在toSplitter中获得相同的文件列表。我可能猜测这不是您期望的,您的目标实际上是只轮询新文件。为此,您应该考虑使用Idempotent Receiver方法来过滤出您已经处理过的那些文件:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints-chapter.html#idempotent-receiver