2016-12-14 7 views
4

Мы используем последнюю версию Spring Boot для Spring и используем последнюю интеграцию Spring для SFTP. Я был на сайте документации Spring Integration SFTP, и я взял конфигурации Spring загрузочную как есть:Spring Integration SFTP Пример с Spring Boot

@Bean 
public SessionFactory<LsEntry> sftpSessionFactory() { 
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); 
    factory.setHost("localhost"); 
    factory.setPort(port); 
    factory.setUser("foo"); 
    factory.setPassword("foo"); 
    factory.setAllowUnknownKeys(true); 
    return new CachingSessionFactory<LsEntry>(factory); 
} 

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

@Bean 
@InboundChannelAdapter(channel = "sftpChannel") 
public MessageSource<File> sftpMessageSource() { 
    SftpInboundFileSynchronizingMessageSource source = 
      new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer()); 
    source.setLocalDirectory(new File("ftp-inbound")); 
    source.setAutoCreateLocalDirectory(true); 
    source.setLocalFilter(new AcceptOnceFileListFilter<File>()); 
    return source; 
} 

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

     @Override 
     public void handleMessage(Message<?> message) throws MessagingException { 
      System.out.println(message.getPayload()); 
     } 

    }; 
} 

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

Когда я искал эту ошибку, другие сообщения в StackOverflow сказали, что мне также пришлось добавить это сообщение об ошибке при загрузке контекста приложения.

@Bean(name = PollerMetadata.DEFAULT_POLLER) 
public PollerMetadata defaultPoller() { 

    PollerMetadata pollerMetadata = new PollerMetadata(); 
    pollerMetadata.setTrigger(new PeriodicTrigger(60)); 
    return pollerMetadata; 
} 

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

Теперь я ищу пример кода, как это сделать и перемещать файлы? Примеры SFTP Spring Integration на GitHub в порядке, но не очень ... далеко от него.

Пример интеграции с базовой весной показывает, как читать файлы с сервера SFTP, если данные настроены с помощью файла application-context.xml. Где пример использования конфигурации Spring Boot, а затем код для чтения с этого сервера и код для теста?

Я понимаю, что независимо от того, используете ли вы класс Java для конфигурации Spring Boot или файл application-context.xml ... рабочий код должен работать одинаково для автономных SFTP-каналов и некоторого входящего адаптера канала.

Так вот код, я пытаюсь сделать работу:

@Component 
@Profile("sftpInputFetch") 
public class SFTPInputFetcher implements InputFetcher 
{ 
    // The PollableChannel seems fine 
    @Autowired 
    PollableChannel sftpChannel; 

    @Autowired 
    SourcePollingChannelAdapter sftpChannelAdapter; 

@Override 
public Stream<String> fetchLatest() throws FileNotFoundException 
{ 
    Stream<String> stream = null; 
    sftpChannelAdapter.start(); 
    Message<?> received = sftpChannel.receive(); 
    File file = (File)received.getPayload(); 
    // get Stream<String> from file 
    return stream; 
} 

В настоящее время "sftpChannelAdapter.start();" это то, с чем я столкнулся. Эта реализация не находит класс «SourcePollingChannelAdapter».

Если это было определено в классическом контексте XML-приложения с «id», тогда этот код автоматически обновляется. С конфигурацией Spring Boot это не похоже на то, что вы можете определить «id» для компонента.

Это просто связано с недостатком знаний о том, как конвертировать из традиционного XML-файла приложения-контекста с аннотациями в код, к использованию полного файла конфигурации контекста приложения Spring Boot.

Любая помощь с этим очень ценится. Благодаря!

ответ

3

Я не понимаю вопроса; Вы сказали

мне пришлось добавить ... чтобы заставить его работать

, а затем

Сейчас я ищу пример кода о том, как сделать эту работу?

Что не работает?

Вы также можете использовать

@InboundChannelAdapter(value = "sftpChannel", poller = @Poller(fixedDelay = "5000")) 

вместо добавления определения в Poller по умолчанию.

Мы будем fix the docs for the missing poller config.

EDIT

Я просто скопировал код в новый загрузочный приложение (с Poller конфигурации), и она работает, как ожидалось.

@SpringBootApplication 
public class SftpJavaApplication { 

    public static void main(String[] args) { 
     new SpringApplicationBuilder(SftpJavaApplication.class).web(false).run(args); 
    } 

    @Bean 
    public SessionFactory<LsEntry> sftpSessionFactory() { 
     DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); 
     factory.setHost("..."); 
     factory.setPort(22); 
     factory.setUser("..."); 
     factory.setPassword("..."); 
     factory.setAllowUnknownKeys(true); 
     return new CachingSessionFactory<LsEntry>(factory); 
    } 

    @Bean 
    public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() { 
     SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory()); 
     fileSynchronizer.setDeleteRemoteFiles(false); 
     fileSynchronizer.setRemoteDirectory("foo"); 
     fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.txt")); 
     return fileSynchronizer; 
    } 

    @Bean 
    @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "5000")) 
    public MessageSource<File> sftpMessageSource() { 
     SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(
       sftpInboundFileSynchronizer()); 
     source.setLocalDirectory(new File("ftp-inbound")); 
     source.setAutoCreateLocalDirectory(true); 
     source.setLocalFilter(new AcceptOnceFileListFilter<File>()); 
     return source; 
    } 

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

      @Override 
      public void handleMessage(Message<?> message) throws MessagingException { 
       System.out.println(message.getPayload()); 
      } 

     }; 
    } 

} 

Результат:

16:57:59.697 [task-scheduler-1] WARN com.jcraft.jsch - Permanently added '10.0.0.3' (RSA) to the list of known hosts. 
ftp-inbound/bar.txt 
ftp-inbound/baz.txt 
+0

Я просто проверял без проблем; см. выше. –

+0

Я только что отредактировал вопрос, чтобы было более ясно, что «не работает». В «@InboundChannelAdapter» у вас есть СЕЙЧАС, к которому добавлен опроллер, чего не было в документации sftp. Вы также заставляли его работать? Это было с sftp/test на github? Этот тест показывает XML-файл контекста приложения ... Таким образом, контекст classpathxmlapplication не будет работать. – tjholmes66

+0

В тесте, когда я загружаю контекст приложения из SpringBoot, тогда я должен иметь возможность автоподключить канал и адаптер входящего канала. Я сделал это раньше, но просто не сделал этого с классом конфигурации Spring Boot Java. – tjholmes66