Heim  >  Artikel  >  Spring SFTP Intergation: Handhabung des Verschiebens von Dateien in ein anderes Verzeichnis

Spring SFTP Intergation: Handhabung des Verschiebens von Dateien in ein anderes Verzeichnis

WBOY
WBOYnach vorne
2024-02-09 14:18:09582Durchsuche

Der PHP-Editor stellt Spring SFTP Integration als leistungsstarkes Framework vor, das Entwicklern dabei helfen kann, die Aufgabe des Verschiebens von Dateien von einem Verzeichnis in ein anderes zu bewältigen. Ob auf einem lokalen Server oder einem Remote-Server, dieses Framework erleichtert das Verschieben und Verwalten von Dateien. Es bietet eine Reihe von APIs und Konfigurationsoptionen, mit denen Entwickler die Logik zum Verschieben von Dateien anpassen und verschiedene Ausnahmen behandeln können. Ob bei Anwendungen auf Unternehmensebene oder bei persönlichen Projekten, die Spring SFTP-Integration ist ein sehr praktisches Tool, das es wert ist, erkundet zu werden.

Frageninhalt

Ich bin neu bei der Frühjahrsintergation. Ich muss Dateien vom SFTP-Server aus dem Verzeichnis „user1/upload“ verarbeiten und sie dann in das Verzeichnis „user1/processed“ verschieben. Mein Code funktioniert im Allgemeinen gut, aber ich habe zwei Probleme:

  1. Wenn ich die Anwendung neu starte, werden das Verzeichnis user1/processed und alle zuvor vorhandenen Dateien gelöscht. Ich möchte dort einfach mehr Dateien schreiben, ohne jedes Mal das Verzeichnis zu leeren.

  2. Jedes Mal, wenn ich die Anwendung starte, erhalte ich Dateien (da ich ihre Namen sehe und sie auf der Konsole ausdrucke), erhalte ich alte Dateien, die in das verarbeitete Verzeichnis verschoben wurden. Das kommt mir wirklich seltsam vor, weil ich diese Dateien nicht sehe, wenn ich über andere Tools wie winscp eine Verbindung zu SFTP herstelle. Wurde die alte Dateiliste irgendwo gewürdigt?

@Value("${cielo.sftp.host}")
    private String sftpHost;
    @Value("${cielo.sftp.port}")
    private int sftpPort;
    @Value("${cielo.sftp.user}")
    private String sftpUser;
    @Value("${cielo.sftp.pass}")
    private String sftpPasword;
    @Value("${cielo.sftp.remotedir}")
    private String sftpRemoteDirectoryDownload;

    @Value("${cielo.sftp.localdir}")
    private String sftpLocalDirectoryDownload;
    @Value("${cielo.sftp.filter}")
    private String sftpRemoteDirectoryDownloadFilter;

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SessionFactory<LsEntry> sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
        factory.setHost(sftpHost);
        factory.setPort(sftpPort);
        factory.setUser(sftpUser);
        factory.setPassword(sftpPasword);

        factory.setAllowUnknownKeys(true); //Set to true to allow connections to hosts with unknown (or changed) keys. Its default is 'false'. If false, a pre-populated knownHosts file is required.
        return new CachingSessionFactory<>(factory);
    }


    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE - 1)
    public SftpInboundFileSynchronizer sftpInboundFileSynchronizer(final SessionFactory<LsEntry> sftpSessionFactory) {
        SftpInboundFileSynchronizer fileSynchronizer =
                new SftpInboundFileSynchronizer(sftpSessionFactory);
        fileSynchronizer.setDeleteRemoteFiles(false);
        fileSynchronizer.setRemoteDirectory(sftpRemoteDirectoryDownload);
        fileSynchronizer
                .setFilter(new SftpSimplePatternFileListFilter(sftpRemoteDirectoryDownloadFilter)); //todo maybe use RegexPatternFileListFilter?
        return fileSynchronizer;
    }

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE - 2)
    @InboundChannelAdapter(channel = "fromSftpChannel", poller = @Poller(fixedDelay = "1000"))
    //@InboundChannelAdapter(channel = "fromSftpChannel", poller = @Poller(cron = "${cielo.sftp.poller.cron}"))

    public MessageSource<File> sftpMessageSource(final SftpInboundFileSynchronizer sftpInboundFileSynchronizer) {
        SftpInboundFileSynchronizingMessageSource source =
                new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer);
        source.setLocalDirectory(new File("/tmp/local"));
        source.setAutoCreateLocalDirectory(true);
        source.setLocalFilter(new AcceptOnceFileListFilter<File>());
        return source;
    }

    @Bean
    @ServiceActivator(
            inputChannel = "fromSftpChannel")
    public MessageHandler resultFileHandler() {
        return new MessageHandler() {
            @Override
            public void handleMessage(final Message<?> message) throws MessagingException {
                String payload = String.valueOf(message.getPayload());
                System.err.println(payload);
            }
        };
    }

    private static final SpelExpressionParser PARSER = new SpelExpressionParser();

    @Bean(name="fromSftpChannel")
    public MessageChannel fromSftpChannel() {
        return new PublishSubscribeChannel();
    }

    @Bean
    @ServiceActivator(inputChannel = "fromSftpChannel")
    @Order(Ordered.LOWEST_PRECEDENCE)
    public MessageHandler moveFile() {
        SftpOutboundGateway sftpOutboundGateway = new  SftpOutboundGateway(sftpSessionFactory(), AbstractRemoteFileOutboundGateway.Command.MV.getCommand(), "'/user1/upload/'.concat(" + PARSER.parseExpression("payload.getName()").getExpressionString() + ")");
        sftpOutboundGateway.setRenameExpressionString("'/user1/processed/'.concat(" + PARSER.parseExpression("payload.getName()").getExpressionString() + ")");
        sftpOutboundGateway.setRequiresReply(false);
        sftpOutboundGateway.setOutputChannelName("nullChannel");
        sftpOutboundGateway.setOrder(Ordered.LOWEST_PRECEDENCE);
        sftpOutboundGateway.setAsync(true);
        return sftpOutboundGateway;
    }

Danke für deine Hilfe!

Ich habe mir die Beispiele in Spring Integration – SFTP zum Umbenennen oder Verschieben von Dateien auf einem Remote-Server nach dem Kopieren angesehen und es hat mir sehr geholfen

Ich habe auch die offizielle Spring Intergation SFTP-Dokumentation überprüft.

Problemumgehung:

Ich bin nicht sicher, wie ich das Remote-Verzeichnis beim Start löschen soll. Dieses Verhalten muss auf Ihrer Seite debuggt werden. Aber ich kann Ihnen sagen, warum Sie alte Dateien sehen. Sie benennen nach der Verarbeitung remote um, lokale Kopien der Dateien werden jedoch weiterhin auf source.setLocalDirectory(new File("/tmp/local")); gespeichert. Wenn Sie mit dem Umbenennen oder Neustarten fertig sind, sollten Sie darüber nachdenken, es zu bereinigen.

Sie können auch SftpStreamingMessageSource überprüfen, um Ihre Logik zu ersetzen: https://docs.spring.io/spring-integration/reference/sftp/streaming.html

Das obige ist der detaillierte Inhalt vonSpring SFTP Intergation: Handhabung des Verschiebens von Dateien in ein anderes Verzeichnis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen