spring integration sftp:如何手动触发下载动作并在下载完成后做其他事情?

Posted

技术标签:

【中文标题】spring integration sftp:如何手动触发下载动作并在下载完成后做其他事情?【英文标题】:spring integration sftp: how to trigger the download action manually and do other things after download finish? 【发布时间】:2018-03-24 02:28:25 【问题描述】:

我在我的项目中使用 spring batch + spring integration sftp。 我不希望在应用启动时触发下载。我希望在第 1 步中触发下载过程,并在所有文件下载到本地后继续第 2 步,不知道如何实现

【问题讨论】:

【参考方案1】:

您需要使用<int-sftp:outbound-gateway>MGET 命令:

mget 操作产生的消息负载是一个List<File> 对象 - 一个文件对象列表,每个对象代表一个检索到的文件。

file_remoteDirectory 标头中提供了远程目录,file_remoteFile 标头中提供了文件名的模式。

https://docs.spring.io/spring-integration/docs/4.3.12.RELEASE/reference/html/sftp.html#sftp-outbound-gateway

在 Java DSL 中它看起来像:

.handle(Sftp.outboundGateway(sessionFactory(), AbstractRemoteFileOutboundGateway.Command.MGET,
                        "payload")
                        .options(AbstractRemoteFileOutboundGateway.Option.RECURSIVE)
                        .regexFileNameFilter("(subSftpSource|.*1.txt)")
                        .localDirectoryExpression("'" + getTargetLocalDirectoryName() + "' + #remoteDirectory")
                        .localFilenameExpression("#remoteFileName.replaceFirst('sftpSource', 'localTarget')"))

payload 是用于远程目录评估的 SpEL 表达式。在这种情况下,它实际上只是请求消息的有效负载:

String dir = "sftpSource/";
registration.getInputChannel().send(new GenericMessage<>(dir + "*"));

如果您的远程目录是静态的并且没有从批处理中更改,您可以在 XML 定义中将其用作 LiteralExpression - expresion="'myRemoteDir'"

由于此 MGET 命令的结果是 List&lt;File&gt;,您应该考虑使用 Splitter 作为下一步。

【讨论】:

嗨@Gary,我已经在this post 上尝试使用mget 命令的outbound-gateway,我想使用java config,但我仍然遇到一些问题,我已经阅读了文档和github 示例,但我仍然无法解决,你能提供一些带有java配置的mget示例吗? TIA

以上是关于spring integration sftp:如何手动触发下载动作并在下载完成后做其他事情?的主要内容,如果未能解决你的问题,请参考以下文章

spring-integration-file 的 junit 测试用例

如何确保 SFTP 会话始终在 spring-batch 结束时关闭

设置到 Windows SFTP 服务器的 WSO2 Enterprise Integrator VFS 连接

Spring test integration not run 我如何处理这个错误?

Spring Batch - Spring 集成

spring integration:如何从 Spring Controller 调用 Spring Integration?