2016-10-24 10 views
0

Mit Spring FTP-Integration und Annotation-Konfiguration habe ich Dateien vom FTP-Server heruntergeladen. Nach dem Download noch unsere Anwendung ist Trigger, um den Server zu verbinden und die neu hinzugekommenen Dateien zu finden, wenn irgendwelche Dateien hinzugefügt werden, wird es vom Server heruntergeladen. Aber ich muss die FTP-Server-Sitzung nicht am Leben erhalten und den Server nach der ersten Verbindung oder dem ersten Mal trennen.Trennen der FTP-Serververbindung nach dem Herunterladen von Dateien?

Code:

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; 
    } 

} 

und ich auch die AbtractFTPSessionFactory.java außer Kraft setzen FTP-Server-Verbindung und Trennung Prozess zu testen.

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

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

Console:

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 

Dank.

Antwort

1

Das ist wirklich ein Zweck von jedem @InboundChannelAdapter: das Zielsystem regelmäßig nach neuen Daten abfragen.

, das zu tun, wenn wir vorschlagen manchmal 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; 
    } 

} 

Aber dies für Ihren Fall könnte nicht funktionieren, weil es noch nicht Dateien im Quell FTP-Verzeichnis gewünscht sein könnte.

Deshalb müssen wir abfragen, bis Sie die erforderlichen Dateien und .stop() einen Adapter erhalten, wenn diese Bedingung erfüllt ist. http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#conditional-pollers

+0

Dank für Ihre Antwort:

Zu diesem Zweck Sie eine nachgeschaltete Logik verwenden können, um den Zustand zu bestimmen oder prüfen, AbstractMessageSourceAdvice zu implementieren, um die PollerMetadata der @Poller injiziert werden. –

+0

Es funktioniert gut, aber es löst immer noch die AbstractMessageSourceAdvice-Unterklasse aus und nach einiger Geschäftslogik gebe ich false von beforeReceive (MessageSource source) zurück, so dass es keinen FTP-Server auslöst. Beeinflusst es unsere Anwendungsleistung? –

+0

Nun, nicht so sehr, aber vermeiden, dass die Auslösung insgesamt Sie stoppen Endpunkt Inbound Channel Adapter –

Verwandte Themen