Spring Integration ftp файлы обработки канала inboud в определенном порядке

Я использую Spring Integration для опроса файлов с удаленного FTP-сервера и их обработки.

Есть ли способ настроить FtpInboundFileSynchronizer (или другой компонент) для получения и обработки удаленных файлов в определенном порядке. Скажем, у меня есть file1 и file2 в удаленном каталоге, можно ли получить и обработать file1 до file2.

заранее спасибо


person ikane    schedule 24.03.2018    source источник


Ответы (1)


Для этого есть (как минимум) 3 метода:

  1. Добавьте в синхронизатор пользовательский FileListFilter<FTPFile> (который сортирует объекты FTPFile в желаемом вами порядке).

  2. Используйте два исходящих шлюза FTP: один для списка (ls) файлов и один для получения каждого файла по мере необходимости.

  3. Используйте FtpRemoteFileTemplate в своем собственном коде для просмотра и извлечения файлов.

ИЗМЕНИТЬ

Фактически, для №1 вам также понадобится пользовательский FileListFilter<File> в локальном фильтре для сортировки File объектов. Поскольку локальные файлы отправляются как полезные данные сообщения после завершения синхронизации.

EDIT2 Пример шаблона удаленного файла

Это просто копирует первый файл в списке, но он должен дать вам то, что вам нужно ...

@SpringBootApplication
public class So49462148Application {

    public static void main(String[] args) {
        SpringApplication.run(So49462148Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(FtpRemoteFileTemplate template) {
        return args -> {
            FTPFile[] files = template.list("*.txt");
            System.out.println(Arrays.toString(files));
            template.get(files[0].getName(), is -> {
                File file = new File("/tmp/" + files[0].getName());
                FileOutputStream os = new FileOutputStream(file);
                FileCopyUtils.copy(is, os);
                System.out.println("Copied: " + file.getAbsolutePath());
            });
        };
    }

    @Bean
    public DefaultFtpSessionFactory sf() {
        DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
        sf.setHost("...");
        sf.setUsername("...");
        sf.setPassword("...");
        return sf;
    }

    @Bean
    public FtpRemoteFileTemplate template(DefaultFtpSessionFactory sf) {
        FtpRemoteFileTemplate template = new FtpRemoteFileTemplate(sf);
        template.setRemoteDirectoryExpression(new LiteralExpression("foo"));
        return template;
    }

}
person Gary Russell    schedule 24.03.2018
comment
Спасибо, Гэри. Есть какие-нибудь примеры, указывающие на то, что я использую FtpRemoteFileTemplate? - person ikane; 25.03.2018
comment
Я добавил к своему ответу простой пример. - person Gary Russell; 25.03.2018