2016-05-25 3 views
0

У нас есть файл download с FTP, и есть странное поведение, с которым входящий адаптер ftp перестает работать после сброса сети, вот шаги для воспроизведения проблемы:Весна интеграции FTP InboundChannelAdapter умирает после сброса сети

  1. запуска приложение
  2. приложение начинает загружать файлы с FTP-сервера на локальный
  3. там filename.writing файл, появляющийся в определенном локальном каталоге
  4. вытащить сетевой кабель (для имитации сброса сети ситуация)
  5. приложение останавливается для загрузки файла (очевидно, нет сетевого подключения)
  6. подключить сетевой кабель.
  7. загрузка не перезапускается или не перезагружается, приложение остается неподвижным.
  8. не существует LOG вообще, чтобы идентифицировать эту проблему.

Заранее благодарен!

ОБНОВЛЕНИЕ

Эта проблема должна быть зафиксирована путем добавления тайм-аут defSession.setConnectTimeout(Integer.valueOf(env.getProperty("ftp.timeout.connect")));

И Приведенный ниже код является Рабочий пример на чтение FTP клиента.

Вот фрагмент кода:

@Bean 
    public DefaultFtpSessionFactory ftpSessionFactory() { 
     DefaultFtpSessionFactory defSession = new DefaultFtpSessionFactory(); 
     defSession.setUsername(env.getProperty("ftp.username")); 
     defSession.setPassword(env.getProperty("ftp.password")); 
     defSession.setPort(21); 
     defSession.setHost(env.getProperty("ftp.host")); 

     defSession.setClientMode(FTPClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE); 
     defSession.setControlEncoding("UTF-8"); 

     return defSession; 
    } 

    @Bean 
    PollableChannel ftpChannel() { 
     return new QueueChannel(Integer.valueOf(env.getProperty("ftp.channel.size"))); 
    } 

    @Bean 
    public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() { 
     FtpInboundFileSynchronizer ftpInboundFileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory()); 
     ftpInboundFileSynchronizer.setDeleteRemoteFiles(Boolean.valueOf(env.getProperty("ftp.directory.delete"))); 

     FtpRegexPatternFileListFilter ftpRegexPatternFileListFilter = new FtpRegexPatternFileListFilter(pattern); 
     ftpInboundFileSynchronizer.setFilter(ftpRegexPatternFileListFilter); 
     ftpInboundFileSynchronizer.setRemoteDirectory(env.getProperty("ftp.directory.remote")); 

     return ftpInboundFileSynchronizer; 
    } 

    @Bean 
    @InboundChannelAdapter(value = "ftpChannel") 
    public FtpInboundFileSynchronizingMessageSource ftpInboundFileSynchronizingMessageSource() { 
     FtpInboundFileSynchronizingMessageSource ftpInboundFileSynchronizingMessageSource = new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer()); 
     ftpInboundFileSynchronizingMessageSource.setLoggingEnabled(true); 
     ftpInboundFileSynchronizingMessageSource.setCountsEnabled(true); 
     ftpInboundFileSynchronizingMessageSource.setAutoCreateLocalDirectory(true); 
     ftpInboundFileSynchronizingMessageSource.setLocalDirectory(new File(env.getProperty("ftp.directory.local"))); 

     return ftpInboundFileSynchronizingMessageSource; 
    } 

    @Bean(name = PollerMetadata.DEFAULT_POLLER) 
    public PollerMetadata defaultPoller() { 
     PollerMetadata pollerMetadata = new PollerMetadata(); 
     pollerMetadata.setErrorHandler(t -> log.error("Failed to retrieve data from FTP: {}", t.getMessage(), t)); 
     pollerMetadata.setTrigger(new PeriodicTrigger(60, TimeUnit.SECONDS)); 
     return pollerMetadata; 
    } 

ответ

0

Скорее всего, поток по-прежнему висит на чтение - если тянуть кабель от фактического адаптера на компьютере, сетевой стек должен уведомить процесс Java, который сокет пропал, но если вы потянете кабель от нисходящего маршрутизатора, сигнал не может быть. jstack покажет, что делает поток.

Необходимо установить тайм-ауты на заводе-изготовителе - см. the documentation, а javadocs FtpClient - dataTimeout используется для чтения.

+0

Спасибо! в нашем случае кабель был вытащен из нисходящего потока, я попробую его и дам вам знать, если это причина, другой вопрос будет, почему в модуле 'spring-integration-ftp' очень мало регистрации, как мы можем улучшить Это? – Jaiwo99

+0

Я не уверен, что вы подразумеваете под «немногими» - если поток «застрял» в чтении, он ничего не может зарегистрировать. Вы можете использовать ведение журнала DEBUG для получения большего количества журналов, когда он работает нормально. –

+0

мы устанавливаем 'logging.level.org.springframework.integration: TRACE', единственный доступный мне журнал:' 2016-05-25 16: 32: 11.677 DEBUG 24075 --- [ask-scheduler-5] osifsDefaultFtpSessionFactory: подключен на сервер [ip] ' – Jaiwo99