2016-10-24 134 views
0

使用Spring FTP集成和注解配置,我从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被注入到@PollerPollerMetadatahttp://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#conditional-pollers

+0

谢谢您的回答。 –

+0

它的工作正常,但它仍然触发AbstractMessageSourceAdvice子类和一些业务逻辑后,我从beforeReceive(MessageSource 源)返回false,所以它不会触发FTP服务器。是否影响我们的应用程序性能。 –

+0

好吧,不是那么多,但是完全避免触发,你可以考虑停止入站通道适配器端点 –

相关问题