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<File>
,您应该考虑使用 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 integration:如何从 Spring Controller 调用 Spring Integration?