gpt4 book ai didi

java - 使用 SFTP 入站重新下载本地删除的文件的过程是什么

转载 作者:行者123 更新时间:2023-12-02 05:43:25 25 4
gpt4 key购买 nike

根据此 doc 找不到从远程 SFTP 重新下载本地删除的文件的正确流程。

要求是,删除已从远程 SFTP 获取的本地文件,并在需要时使用 sftp-inbound-adapter ( DSL configuration ) 重新获取相同的文件。在此实现中,MetadataStore 尚未持久保存到 PropertiesPersistingMetadataStoreRedis 元数据存储 等任何外部系统中。因此,按照 doc MetadataStore 存储在内存中

无法找到任何方法从 MetadataStore 中删除该远程文件的元数据,以使用 file_name 重新获取本地删除的文件。并且没有任何线索,应该如何实现这个 removeRemoteFileMetadata() 回调 ( according to this doc )。

配置类包含以下内容:

    @Bean
public IntegrationFlow fileFlow() {
SftpInboundChannelAdapterSpec spec = Sftp.inboundAdapter(sftpConfig.getSftpSessionFactory())
.preserveTimestamp(true)
.patternFilter(Constants.FILE_NAME_CONVENTION)
.remoteDirectory(sftpConfig.getSourceLocation())
.autoCreateLocalDirectory(true)
.deleteRemoteFiles(false)
.localDirectory(new File(sftpConfig.getDestinationLocation()));

return IntegrationFlows
.from(spec, e -> e.id("sftpInboundAdapter").autoStartup(false)
.poller(Pollers.fixedDelay(5000).get()))
.channel(MessageChannels.direct().get())
.handle(message -> {
log.info("Fetching File : " + message.getHeaders().get("file_name").toString());
})
.get();
}

最佳答案

我试图解决这个问题,我使用了 Tanvir Hossain的引用代码。我是这样编码的。

@Bean
public IntegrationFlow fileFlow() {
SftpInboundChannelAdapterSpec spec = Sftp
.inboundAdapter(sftpConfig.getSftpSessionFactory())
.preserveTimestamp(true)
.filter(sftpFileListFilter())
.localFilter(systemFileListFilter())
.remoteDirectory(sftpConfig.getSourceLocation())
.autoCreateLocalDirectory(true)
.deleteRemoteFiles(false)
.localDirectory(new File(sftpConfig.getDestinationLocation()));

return IntegrationFlows
.from(spec, e -> e.id("sftpInboundAdapter").autoStartup(false)
.poller(Pollers.fixedDelay(5000).get()))
.channel(MessageChannels.direct().get())
.handle(message -> {
log.info("Fetching File : "
+ message.getHeaders().get("file_name").toString());
})
.get();
}


private FileSystemPersistentAcceptOnceFileListFilter systemFileListFilter() {

return new FileSystemPersistentAcceptOnceFileListFilter(store(), prefix);
}


private ChainFileListFilter<ChannelSftp.LsEntry> sftpFileListFilter() {

ChainFileListFilter<ChannelSftp.LsEntry> chainFileListFilter =
new ChainFileListFilter<>();
chainFileListFilter.addFilters(
new SftpPersistentAcceptOnceFileListFilter(store(), prefix),
new SftpSimplePatternFileListFilter(sftpConfig.getFileFilterValue())
);
return chainFileListFilter;
}

@Bean
public SimpleMetadataStore store() {
return new SimpleMetadataStore();
}

和我用于删除元数据的Controller如下所示:

public class Controller { 

private final SimpleMetadataStore simpleMetadataStore;

public Controller(SimpleMetadataStore simpleMetadataStore) {

this.simpleMetadataStore = simpleMetadataStore;

}

@GetMapping("/test/remove-metadata/{type}/{fileName}")
@ResponseBody
public String removeFileMetadata(
@PathVariable("fileName") String fileName,
@PathVariable("type") String type
) {
String prefix = definedPrefix;
String filePath = "";
if(type.equals("local")){
filePath = "/local/storage/path/" + fileName;
}else if(type.equals("remote")){
filePath = fileName
}
String key = prefix + filePath;

simpleMetadataStore.remove(key);
return key;
}

}

我正在获取我想要的文件。它正在为我重新获取文件。

关于java - 使用 SFTP 入站重新下载本地删除的文件的过程是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62073217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com