使用Spring Integration我想在远程SFTP服务器上一次移动或删除多个文件或非空文件夹。但我似乎无法在官方Spring docs中找到对此的支持,因为它似乎没有得到支持。虽然文档总是不正确。
我在考虑使用int-sftp:outbound-gateway
和rm
命令以及目录名称的有效负载。但它似乎没有用。我还没有尝试使用mv
,但我想知道是否有人在Spring Integration中有过这种行为的经验。
答案 0 :(得分:0)
您的问题不是很清楚:您要在SFTP服务器上删除本地应用程序或远程文件?
以下是我的应用程序中的一个示例,也许可以提供帮助:传入的消息(有效负载中的文件名)首先发送到远程SFTP服务器,然后在本地删除
<integration:publish-subscribe-channel
id="sftpChannel" />
<!-- The processed file will be sftped to the server -->
<sftp:outbound-channel-adapter id="sftpOutboundAdapter"
session-factory="sftpSessionFactory" channel="sftpChannel" order="1"
charset="UTF-8" remote-file-separator="/" remote-directory="${sftp.remote.directory}"
remote-filename-generator-expression="payload.getName()" mode="REPLACE" />
<!-- sftped file will be removed from the staging folder -->
<integration:service-activator
input-channel="sftpChannel" output-channel="nullChannel" ref="sftpFileDeleter"
method="deleteAfterSftpingFile" order="2" />
使用SftpFileDeleter
public class SftpFileDeleter {
private static final Logger LOGGER = Logger
.getLogger(SftpFileDeleter.class);
@ServiceActivator
public void deleteAfterSftpingFile(Message<File> fileMessage) throws IOException{
Path fileToDeletePath = Paths.get(fileMessage.getPayload().getAbsolutePath());
Files.delete(fileToDeletePath);
LOGGER.info("[SENT]File Sent to Sftp Server and deleted:"+fileToDeletePath.getFileName());
}
}
答案 1 :(得分:0)
你看过这个例子了吗?
看起来这正是你想要做的。但是你可能做错的一件事是,根据文档(http://docs.spring.io/spring-integration/reference/html/sftp.html,第26.7节),收到的消息的有效负载不必包含文件名:你需要小心标题虽然,并使用正确的值设置正确的属性(在您的情况下为file_remoteDirectory / file_remoteFile)。
我不知道您当前的配置,但您可能需要在SFTP出站网关之前使用消息转换器,以将信息从有效负载移动到消息的标头。
答案 2 :(得分:0)
我在Spring上编写自己的代码解决了这个问题,正如@Vincent_F建议的那样。首先,您需要autowire
SFTP会话工厂,如下所示:
@Autowired
private DefaultSftpSessionFactory sftpSessionFactory;
在我的情况下,会话可以用来重命名目录。这可能也适用于默认的Spring DSL或XML,但我无法使它工作......这是我自己的代码与此用例相关:
SftpSession session = sftpSessionFactory.getSession();
try {
if (!session.exists(sftpConfiguration.getOtherRemoteDirectory())) {
throw new FileNotFoundException("Remote directory does not exists... Continuing");
}
for (ChannelSftp.LsEntry entry : session.list(sftpConfiguration.getRemoteDirectory())) {
if (entry.getFilename().equalsIgnoreCase(sftpConfiguration.getOtherDirectory())) {
session.rename(sftpConfiguration.getOtherRemoteDirectory(), String.format("%s%s-%s",
sftpConfiguration.getRemoteDirectory(), sftpConfiguration.getReportDirectory(),
this.createDate(new Integer(entry.getAttrs().getMTime()).longValue() * 1000)));
}
}
} catch (FileNotFoundException e) {
logger.error(e.getMessage());
} catch (IOException e) {
logger.error("Could not rename remote directory.", e);
}