このようにdocは、適切なプロセスを見つけられませんでした-ローカルで削除されたファイルをリモートSFTPからダウンロードする。
要件は、リモートSFTPからすでにフェッチされているローカルファイルを削除し、必要に応じてsftp-inbound-adapter( DSL configuration )を使用して同じファイルを再フェッチすることです。この実装では、MetadataStore
はPropertiesPersistingMetadataStore
またはRedis Metadata Store。 docのように、MetadataStore
はIn-Memoryに格納されます。
そのリモートファイルのメタデータをMetadataStore
から削除して、_file_name
_を使用してローカルで削除されたファイルを再フェッチする方法が見つかりませんでした。そして、何の手掛かりもありません、このremoveRemoteFileMetadata()
コールバックをどのように実装する必要がありますか(このドキュメントによると)。
構成クラスには以下が含まれます。
_ @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();
}
_
ChainFileListFilter
とSftpSimplePatternFileListFilter
およびSftpPersistentAcceptOnceFileListFilter
を使用します。
SimpleMetadataStore
を使用して状態をメモリに保存します(または他のMetadataStore
)。
new SftpPersistentAcceptOnceFileListFilter(store, "somePrefix");
次に、store.remove(key)
で、key
はsomePrefix
+ fileName
です。
localFilter
でFileSystemPersistentAcceptOnceFileListFilter
と同様のフィルターを使用します。
私はこれを解決しようとしました 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;
}
}
目的のファイルを取得しています。私にとってはファイルを再取得しています。