Maison  >  Article  >  Spring SFTP Intergation : gestion du déplacement de fichiers vers un autre répertoire

Spring SFTP Intergation : gestion du déplacement de fichiers vers un autre répertoire

WBOY
WBOYavant
2024-02-09 14:18:09515parcourir

L'éditeur php présente Spring SFTP Integration comme un framework puissant qui peut aider les développeurs à gérer la tâche de déplacement de fichiers d'un répertoire à un autre. Que ce soit sur un serveur local ou un serveur distant, ce framework facilite le déplacement et la gestion des fichiers. Il fournit une série d'API et d'options de configuration qui permettent aux développeurs de personnaliser la logique de déplacement des fichiers et de gérer diverses exceptions. Qu'il s'agisse d'applications au niveau de l'entreprise ou de projets personnels, Spring SFTP Integration est un outil très pratique qui mérite d'être exploré.

Contenu des questions

Je suis nouveau dans l'intergation de printemps. Je dois traiter les fichiers du serveur SFTP à partir du répertoire user1/upload, puis les déplacer vers le répertoire user1/processed. Mon code fonctionne généralement bien, mais j'ai deux problèmes :

  1. Lorsque je redémarre l'application, le répertoire user1/processed et tous les fichiers qui existaient auparavant sont supprimés. Je veux juste y écrire plus de fichiers sans effacer le répertoire à chaque fois.

  2. Chaque fois que je démarre l'application, je reçois des fichiers (au fur et à mesure que je vois leurs noms et que j'imprime sur la console), je reçois d'anciens fichiers qui ont été déplacés vers le répertoire traité. Cela semble vraiment bizarre car je ne vois pas ces fichiers lorsque je me connecte à sftp via d'autres outils comme winscp. L'ancienne liste de fichiers a-t-elle été respectée quelque part ?

@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;
    }

Merci pour votre aide !

J'ai regardé les exemples dans l'intégration Spring - sftp pour renommer ou déplacer des fichiers sur un serveur distant après la copie et cela m'a beaucoup aidé

J'ai également vérifié la documentation officielle sftp de Spring Intergation

Solution de contournement

Je ne sais pas comment effacer le répertoire distant au démarrage. Ce comportement doit être débogué de votre côté. Mais je peux vous dire pourquoi vous voyez d'anciens fichiers. Vous renommez à distance après le traitement, mais les copies locales des fichiers sont toujours stockées sur source.setLocalDirectory(new File("/tmp/local"));. Une fois que vous avez fini de renommer ou de redémarrer, pensez à le nettoyer.

Vous pouvez également cocher SftpStreamingMessageSource pour remplacer votre logique : https://docs.spring.io/spring-integration/reference/sftp/streaming.html

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer