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.
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 diePollerMetadata
der@Poller
injiziert werden. –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? –
Nun, nicht so sehr, aber vermeiden, dass die Auslösung insgesamt Sie stoppen Endpunkt Inbound Channel Adapter –