2017-01-29 3 views
1

Collegues, я пытаюсь загрузить папки с файлами из sftp, используя весеннюю интеграцию.Как синхронизировать файлы из более чем одной папки между Ftp и локальной папкой с помощью Spring Integration?

можно синхронизировать файлы из одного папок 20161207:

@Bean 
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() { 
    SftpInboundFileSynchronizer fileSynchronizer = 
     new SftpInboundFileSynchronizer(sftpSessionFactory()); 
    fileSynchronizer.setDeleteRemoteFiles(false); 
    fileSynchronizer.setRemoteDirectory("/pub/op/20161207/"); 
    fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.xml")); 
    return fileSynchronizer; 
} 

Но что я должен делать, если нужно загрузить (синхронизированные) файлы из более чем одной папки (20161208, 20161209 и т.д.)? У вас есть пример? Спасибо.

UPDATE Я пытался использовать SftpRegexPatternFileListFilter, но это не помогло:

@Bean 
    public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() { 
     SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory()); 
     fileSynchronizer.setDeleteRemoteFiles(false); 
     fileSynchronizer.setRemoteDirectory("/pub/op/"); 
     Pattern pattern = Pattern.compile(".*\\.xml$"); 
     SftpRegexPatternFileListFilter sftpRegexPatternFileListFilter = new SftpRegexPatternFileListFilter(pattern); 
     fileSynchronizer.setFilter(sftpRegexPatternFileListFilter); 
     //fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.xml")); 
     return fileSynchronizer; 
    } 

UPDATE Кодекс replac4ed здесь по совету:

@Bean @ServiceActivator(inputChannel = "sftpChannel") 
    public MessageHandler handler() 
    { SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(sftpSessionFactory(), "MGET", "payload"); 
     sftpOutboundGateway.setLocalDirectory(new File("sftp-inbound")); 
     return sftpOutboundGateway;} 

UPDATE Артем, Гэри, спасибо вам за помощь. Это мой код: @Bean общественного DefaultSftpSessionFactory sftpSessionFactory() {

 DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(); 
     factory.setHost(server); 
     factory.setPort(port); 
     factory.setAllowUnknownKeys(true); 
     factory.setUser(login); 
     factory.setPassword(pass); 
     factory.setTimeout(60*1000); 
     return factory; 
    } 


@Bean 
    @ServiceActivator(inputChannel = "sftpChannel") 
    public MessageHandler handler() { 
     SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(sftpSessionFactory(), "mget", "getPayload() == '/pub/op/20170130/test.xml'"); 
     sftpOutboundGateway.setLocalDirectory(new File("C:/test/gateway/")); 
     return sftpOutboundGateway; 
    } 

Когда я запустить приложение я получаю следующий вывод

12:25:58.593 INFO [main] o.s.c.s.DefaultLifecycleProcessor : Starting beans in phase -2147483648 
12:25:58.593 INFO [main] o.s.i.endpoint.EventDrivenConsumer : Adding {sftp:outbound-gateway:aameFtpConfig.handler.serviceActivator} as a subscriber to the 'sftpChannel' channel 
12:25:58.593 INFO [main] o.s.i.channel.DirectChannel : Channel 'org.spring[email protected]4157f54e.sftpChannel' has 1 subscriber(s). 
12:25:58.593 INFO [main] o.s.i.endpoint.EventDrivenConsumer : started aameFtpConfig.handler.serviceActivator 
12:25:58.594 INFO [main] o.s.c.s.DefaultLifecycleProcessor : Starting beans in phase 0 
12:25:58.594 INFO [main] o.s.i.endpoint.EventDrivenConsumer : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel 
12:25:58.594 INFO [main] o.s.i.c.PublishSubscribeChannel : Channel 'org.spring[email protected]4157f54e.errorChannel' has 1 subscriber(s). 
12:25:58.594 INFO [main] o.s.i.endpoint.EventDrivenConsumer : started _org.springframework.integration.errorLogger 

Но файл не копируется в "C:/test/gateway/". Plase, tel me, что я сделал не так?

ответ

1

Попробуйте использовать SftpOutboundGateway с помощью команды MGET.

Этот динамический удаленный каталог может быть как запрос.

Логика опроса, которую вы можете достичь с помощью необработанного метода, вызывающего входной адаптер канала. И это может генерировать имя каталога для отправки.

Вы можете рассмотреть возможность использования Idempotent Receiver после шлюза, чтобы убедиться, что вы не обрабатываете одни и те же файлы снова.

Адаптер входящего канала Sftp не может сделать это для вас, поскольку его цель - проверить тот же ресурс для новых данных.

+2

Начиная с версии 4.2 вы можете использовать 'synchronizer.setRemoteDirectoryExpression' для использования выражения SpEL для генерации каталога, который будет проверяться на каждом опросе, - вы можете повернуть через несколько каталогов таким образом - но нет возможности сканировать несколько каталогов по одному опросу; и все они будут перенесены в один и тот же локальный каталог. Как говорит @Artem, вы можете использовать MGET (с рекурсией) для извлечения из нескольких каталогов. –

+0

I'am новой весна ... мне нужно добавить фасоль, как сделать: '@Bean @ServiceActivator (inputChannel = "sftpChannel") общественного обработчик MessageHandler() { SftpOutboundGateway sftpOutboundGateway = новый SftpOutboundGateway (sftpSessionFactory()," MGET "," полезная нагрузка "); sftpOutboundGateway.setLocalDirectory (новый файл («sftp-inbound»)); return sftpOutboundGateway; } 'в моей конфигурации? – May12

+0

Да, в противном случае это не способ заставить 'SftpOutboundGateway' работать –