Подтвердить что ты не робот

Отправлять и получать файлы с FTP в Spring Загрузка

Я новичок в Spring Framework и, действительно, я изучаю и использую Spring Boot. Недавно, в приложении, которое я разрабатываю, я сделал работу Quartz Scheduler, и теперь я хочу сделать интеграцию с Spring: FTP-соединение с сервером для записи и чтения файлов.

То, что я хочу, очень просто (поскольку я смог сделать это в предыдущем Java-приложении). У меня есть два задания Quartz Jobs, которые планируются в разные времена каждый день: один из них читает файл с FTP-сервера, а другой записывает файл на FTP-сервер.

Я подробно расскажу, что я разработал до сих пор.

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

}

Следующий класс, который я назвал его как FtpGateway, выглядит следующим образом:

@Component
public class FtpGateway {

    @Autowired
    private DefaultFtpsSessionFactory sess;

    public void sendFile(){
        // todo
    }

    public void readFile(){
        // todo
    }

}

Я читаю эту документацию, чтобы научиться этому. Spring Integration FTP, по-видимому, управляется событиями, поэтому я не знаю, как я могу выполнить любой из sendFile() и readFile() с помощью дескрипторов, когда триггер запускается в точное время.

Документация говорит мне что-то об использовании Inbound Channel Adapter (для чтения файлов с FTP?), Outbound Channel Adapter (для записи файлов на FTP?) И Outbound Gateway (для чего?):

Spring Integration поддерживает отправку и получение файлов по FTP/FTPS путем предоставления трех конечных точек клиентской стороны: адаптера входящего канала, адаптера исходящего канала и исходящего шлюза. Он также предоставляет удобные параметры конфигурации на основе пространства имен для определения этих компонентов клиента.

Итак, я не понимаю, как следовать.

Пожалуйста, может кто-нибудь дать мне подсказку?

Спасибо!

EDIT:

Спасибо @M. Deinum. Во-первых, я попробую простую задачу: прочитайте файл с FTP, poller будет запускаться каждые 5 секунд. Это то, что я добавил:

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

    };
}

Затем, когда приложение запущено, я помещаю новую папку csv intro "Entrada" удаленной папке, но метод handler() не запускается через 5 секунд... Я делаю что-то неправильно?

4b9b3361

Ответ 1

Пожалуйста, добавьте @Scheduled (fixedDelay = 5000) по вашему методу poller.