2016-10-24 5 views
0

Используя конфигурацию Spring FTP Integration и Annotation, я загрузил файлы с FTP-сервера. После загрузки все еще наше приложение является триггером для подключения сервера и поиска любых новых добавленных файлов, если какие-либо файлы будут загружены с сервера. Но мне не нужно поддерживать сеанс FTP-сервера и отключать сервер после первого подключения или загружать первый раз.Как отключить подключение FTP-сервера после загрузки файлов?

Код:

public class FtpServices { 

    @Bean(name="ftpSessionFactory") 
    public DefaultFtpSessionFactory ftpSessionFactory() { 
     System.out.println("session"); 

     DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory(); 
     sf.setHost("localhost"); 
     sf.setPort(21); 
     sf.setUsername("user"); 
     sf.setPassword("password"); 

     return sf; 
    } 

    @Bean 
    public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() { 
     System.out.println("2"); 
     FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory()); 
     fileSynchronizer.setDeleteRemoteFiles(false); 
     fileSynchronizer.afterPropertiesSet(); 
     fileSynchronizer.setRemoteDirectory("/test/"); 
     // fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.docx")); 
     fileSynchronizer.setFilter(filter); 
     return fileSynchronizer; 
    } 

    @Bean() 
    @InboundChannelAdapter(value="ftpChannel", poller = @Poller(fixedDelay = "50", maxMessagesPerPoll = "1")) 
    public FtpInboundFileSynchronizingMessageSource ftpMessageSource() { 
     System.out.println(3); 
     FtpInboundFileSynchronizingMessageSource source = 
       new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer()); 
     source.setLocalDirectory(new File("D:/Test-downloaded/")); 
     //source.stop(); 
     return source; 
    } 

    @Bean 
    @ServiceActivator(inputChannel = "ftpChannel", requiresReply="false") 
    public MessageHandler handler() { 
     System.out.println(4); 
     MessageHandler handler = new MessageHandler() { 

      @Override 
      public void handleMessage(Message<?> message) throws MessagingException { 
       System.out.println(message.getPayload()+" @ServiceActivator"); 
       System.out.println(" Message Header :"+message.getHeaders()); 
      } 
     }; 
     return handler; 
    } 

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

     PollerMetadata pollerMetadata = new PollerMetadata(); 
     pollerMetadata.setTrigger(triggerOnlyOnce()); 
     return pollerMetadata; 
    } 

} 

, а также я переопределить AbtractFTPSessionFactory.java, чтобы проверить соединение с сервером FTP и процесс разъединения.

protected void postProcessClientAfterConnect(T t) throws IOException { 
    System.out.println("After connect"); 
} 

protected void postProcessClientBeforeConnect(T client) throws IOException { 
    System.out.println("Before connect"); 
} 

консоли:

INFO : org.springframework.context.support.DefaultLifecycleProcessor - Starting beans in phase -2147483648 
    INFO : org.springframework.context.support.DefaultLifecycleProcessor - Starting beans in phase 0 
    Before connect 
    After connect 
    D:\Test-downloaded\demo 1.txt @ServiceActivator 
    Message Header :{id=e4a1fd7f-0bbf-9692-f70f-b0ac68b4dec4, timestamp=1477317086272} 
    D:\Test-downloaded\demo.txt @ServiceActivator 
    Message Header :{id=9115ee92-12b4-bf1f-d592-9c13bf7a27fa, timestamp=1477317086324} 
    Before connect 
    After connect 
    Before connect 
    After connect 
    Before connect 
    After connect 
    Before connect 
    After connect 
    Before connect 
    After connect 
    Before connect 
    After connect 

Спасибо.

ответ

1

Это действительно цель любого @InboundChannelAdapter: периодически опроса целевой системы для новых данных.

Чтобы сделать это, как только мы иногда предлагаем OnlyOnceTrigger:

public class OnlyOnceTrigger implements Trigger { 

    private final AtomicBoolean done = new AtomicBoolean(); 

    @Override 
    public Date nextExecutionTime(TriggerContext triggerContext) { 
      return !this.done.getAndSet(true) ? new Date() : null; 
    } 

} 

Но это может не работать для вашего дела, потому что не может быть желательно файлы в исходном каталоге FTP пока.

Поэтому мы должны опросить, пока вы не получите требуемые файлы и адаптер .stop(), если это условие выполнено.

Для этой цели можно использовать любого вниз по течению логики для определения состояния или рассмотреть для реализации AbstractMessageSourceAdvice, который будет введен в PollerMetadata в @Poller: http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#conditional-pollers

+0

спасибо за ваш ответ. –

+0

Его работа прекрасна, но все же он вызывает подкласс AbstractMessageSourceAdvice и после некоторой бизнес-логики, я возвращаю false из beforeReceive (источник MessageSource ), поэтому он не запускает FTP-сервер. это влияет на производительность нашего приложения. –

+0

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