Spring 集成:如何使用 IntegrationFlow 在 sftp 上动态创建子目录
Spring Integration: How to dynamically create subdir on sftp using IntegrationFlow
我有一个在动态创建的某些子目录下将文件传输到 sftp 的用例。
我使用自定义 SftpMessageHandler 方法和网关来完成这项工作。但这种方法的问题是,它在成功上传后并没有删除本地临时文件。
为了解决这个问题,现在我正在使用 IntegrationFlow 和表达式 Advice(如下所示),这确实会删除本地文件,但我不知道如何动态创建远程 subDirs。我阅读了远程目录表达式,但不确定如何 use/implement 它。
有人解决了这个问题吗?感谢您的帮助!
@Bean
public IntegrationFlow sftpOutboundFlow() {
return IntegrationFlows.from("toSftpChannel")
.handle(Sftp.outboundAdapter(this.sftpSessionFactory())
.remoteFileSeparator("/")
.useTemporaryFileName(false)
.remoteDirectory("/temp"), c -> c.advice(expressionAdvice(c)))
.get();
}
@Bean
public Advice expressionAdvice(GenericEndpointSpec<FileTransferringMessageHandler<ChannelSftp.LsEntry>> c) {
ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnSuccessExpressionString("payload.delete()");
advice.setOnFailureExpressionString("payload + ' failed to upload'");
advice.setTrapException(true);
return advice;
}
@MessagingGateway
public interface UploadGateway {
@Gateway(requestChannel = "toSftpChannel")
void upload(File file);
}
Sftp.outboundAdapter()
对远程目录有这些选项:
/**
* Specify a remote directory path.
* @param remoteDirectory the remote directory path.
* @return the current Spec
*/
public S remoteDirectory(String remoteDirectory) {
}
/**
* Specify a remote directory path SpEL expression.
* @param remoteDirectoryExpression the remote directory expression
* @return the current Spec
*/
public S remoteDirectoryExpression(String remoteDirectoryExpression) {
}
/**
* Specify a remote directory path {@link Function}.
* @param remoteDirectoryFunction the remote directory {@link Function}
* @param <P> the expected payload type.
* @return the current Spec
*/
public <P> S remoteDirectory(Function<Message<P>, String> remoteDirectoryFunction) {
}
因此,如果故事是关于 dynamic 子目录的,您可以选择 remoteDirectoryExpression
或 remoteDirectory(Function)
并根据消息计算目标路径或应用程序上下文中的一些 bean。
例如:
.remoteDirectoryExpression("'rootDir/' + headers.subDir")
另请记住,对于不存在的目录,您也需要配置 .autoCreateDirectory(true)
。
我有一个在动态创建的某些子目录下将文件传输到 sftp 的用例。 我使用自定义 SftpMessageHandler 方法和网关来完成这项工作。但这种方法的问题是,它在成功上传后并没有删除本地临时文件。 为了解决这个问题,现在我正在使用 IntegrationFlow 和表达式 Advice(如下所示),这确实会删除本地文件,但我不知道如何动态创建远程 subDirs。我阅读了远程目录表达式,但不确定如何 use/implement 它。
有人解决了这个问题吗?感谢您的帮助!
@Bean
public IntegrationFlow sftpOutboundFlow() {
return IntegrationFlows.from("toSftpChannel")
.handle(Sftp.outboundAdapter(this.sftpSessionFactory())
.remoteFileSeparator("/")
.useTemporaryFileName(false)
.remoteDirectory("/temp"), c -> c.advice(expressionAdvice(c)))
.get();
}
@Bean
public Advice expressionAdvice(GenericEndpointSpec<FileTransferringMessageHandler<ChannelSftp.LsEntry>> c) {
ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnSuccessExpressionString("payload.delete()");
advice.setOnFailureExpressionString("payload + ' failed to upload'");
advice.setTrapException(true);
return advice;
}
@MessagingGateway
public interface UploadGateway {
@Gateway(requestChannel = "toSftpChannel")
void upload(File file);
}
Sftp.outboundAdapter()
对远程目录有这些选项:
/**
* Specify a remote directory path.
* @param remoteDirectory the remote directory path.
* @return the current Spec
*/
public S remoteDirectory(String remoteDirectory) {
}
/**
* Specify a remote directory path SpEL expression.
* @param remoteDirectoryExpression the remote directory expression
* @return the current Spec
*/
public S remoteDirectoryExpression(String remoteDirectoryExpression) {
}
/**
* Specify a remote directory path {@link Function}.
* @param remoteDirectoryFunction the remote directory {@link Function}
* @param <P> the expected payload type.
* @return the current Spec
*/
public <P> S remoteDirectory(Function<Message<P>, String> remoteDirectoryFunction) {
}
因此,如果故事是关于 dynamic 子目录的,您可以选择 remoteDirectoryExpression
或 remoteDirectory(Function)
并根据消息计算目标路径或应用程序上下文中的一些 bean。
例如:
.remoteDirectoryExpression("'rootDir/' + headers.subDir")
另请记住,对于不存在的目录,您也需要配置 .autoCreateDirectory(true)
。