web-dev-qa-db-ja.com

SFTPインバウンドを使用してローカルで削除されたファイルを再ダウンロードする手順は何ですか

このようにdocは、適切なプロセスを見つけられませんでした-ローカルで削除されたファイルをリモートSFTPからダウンロードする。

要件は、リモートSFTPからすでにフェッチされているローカルファイルを削除し、必要に応じてsftp-inbound-adapter( DSL configuration )を使用して同じファイルを再フェッチすることです。この実装では、MetadataStorePropertiesPersistingMetadataStoreまたはRedis Metadata Storedocのように、MetadataStoreIn-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();
    }
_
2
Tanvir Hossain

ChainFileListFilterSftpSimplePatternFileListFilterおよびSftpPersistentAcceptOnceFileListFilterを使用します。

SimpleMetadataStoreを使用して状態をメモリに保存します(または他のMetadataStore)。

new SftpPersistentAcceptOnceFileListFilter(store, "somePrefix");

次に、store.remove(key)で、keysomePrefix + fileNameです。

localFilterFileSystemPersistentAcceptOnceFileListFilterと同様のフィルターを使用します。

1
Gary Russell

私はこれを解決しようとしました 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;
    }

}

目的のファイルを取得しています。私にとってはファイルを再取得しています。

5
laziestcoder