web-dev-qa-db-fra.com

Envoyer et recevoir des fichiers depuis FTP dans Spring Boot

Je suis nouveau dans Spring Framework et, en effet, j'apprends et utilise Spring Boot . Récemment, dans l'application que je développe, j'ai fait fonctionner Quartz Scheduler, et maintenant je veux faire fonctionner Spring Integration là-bas: connexion FTP à un serveur pour écrire et lire des fichiers.

Ce que je veux est vraiment simple (comme j'ai pu le faire dans une précédente Java). J'ai deux Jobs Quartz programmés pour être exécutés à des heures différentes chaque jour: l'un d'eux lit un fichier à partir d'un serveur FTP et un autre écrit un fichier sur un serveur FTP.

Je vais détailler ce que j'ai développé jusqu'à présent.

@SpringBootApplication
@ImportResource("classpath:ws-config.xml")
@EnableIntegration
@EnableScheduling
public class MyApp extends SpringBootServletInitializer {

    @Autowired
    private Configuration configuration;

    //...

    @Bean
    public DefaultFtpsSessionFactory  myFtpsSessionFactory(){
        DefaultFtpsSessionFactory sess = new DefaultFtpsSessionFactory();
        Ftp ftp = configuration.getFtp();
        sess.setHost(ftp.getServer());
        sess.setPort(ftp.getPort());
        sess.setUsername(ftp.getUsername());
        sess.setPassword(ftp.getPassword());
        return sess;
    }

}

La classe suivante, je l'ai nommée FtpGateway, comme suit:

@Component
public class FtpGateway {

    @Autowired
    private DefaultFtpsSessionFactory sess;

    public void sendFile(){
        // todo
    }

    public void readFile(){
        // todo
    }

}

Je lis la documentation this pour apprendre à le faire. Le FTP de Spring Integration semble être piloté par les événements, donc je ne sais pas comment exécuter les fonctions sendFile () et readFile () de Jobs lorsque le déclencheur est déclenché à une heure exacte.

La documentation me dit quelque chose sur l'utilisation de l'adaptateur de canal entrant (pour lire des fichiers à partir d'un FTP?), De l'adaptateur de canal sortant (pour écrire des fichiers sur un FTP?) Et de la passerelle sortante (pour faire quoi?):

Spring Integration prend en charge l'envoi et la réception de fichiers via FTP/FTPS en fournissant trois points de terminaison côté client: l'adaptateur de canal entrant, l'adaptateur de canal sortant et la passerelle sortante. Il fournit également des options de configuration pratiques basées sur des espaces de noms pour définir ces composants clients.

Donc, je ne sais pas comment suivre.

S'il vous plaît, quelqu'un pourrait-il me donner un indice?

Je vous remercie!

[~ # ~] éditez [~ # ~] :

Merci @M. Deinum. Tout d'abord, je vais essayer une tâche simple: lire un fichier à partir du FTP, le poller s'exécutera toutes les 5 secondes. Voici ce que j'ai ajouté:

@Bean
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() {
    FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(myFtpsSessionFactory());
    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setPreserveTimestamp(true);
    fileSynchronizer.setRemoteDirectory("/Entrada");
    fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.csv"));
    return fileSynchronizer;
}


@Bean
@InboundChannelAdapter(channel = "ftpChannel", poller = @Poller(fixedDelay = "5000"))
public MessageSource<File> ftpMessageSource() {
    FtpInboundFileSynchronizingMessageSource source = new FtpInboundFileSynchronizingMessageSource(inbound);
    source.setLocalDirectory(new File(configuracion.getDirFicherosDescargados()));
    source.setAutoCreateLocalDirectory(true);
    source.setLocalFilter(new AcceptOnceFileListFilter<File>());
    return source;
}

@Bean
@ServiceActivator(inputChannel = "ftpChannel")
public MessageHandler handler() {
    return new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            Object payload = message.getPayload();
            if(payload instanceof File){
                File f = (File) payload;
                System.out.println(f.getName());
            }else{
                System.out.println(message.getPayload());
            }
        }

    };
}

Ensuite, lorsque l'application est en cours d'exécution, j'ai mis un nouveau dossier distant "Entrada" d'introduction de fichier csv, mais la méthode handler () n'est pas exécutée après 5 secondes ... Je fais quelque chose de mal?

17
russellhoff

Veuillez ajouter @ Scheduled (fixedDelay = 5000) sur votre méthode d'interrogation.

1
Mr Nobody

Vous devez utiliser SPRING BATCH avec tasklet. Il est beaucoup plus facile de configurer le bean, le temps crone, la source d'entrée avec les interfaces existantes fournies par Spring.

https://www.baeldung.com/introduction-to-spring-batch

L'exemple ci-dessus est basé sur les annotations et xml, vous pouvez utiliser l'un ou l'autre.

Autre avantage Utilisez des écouteurs et des étapes parallèles. Ce framework peut également être utilisé de manière Reader - Processor - Writer.

0
Swarit Agarwal