我正在研究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配置
答案 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