Spring Integration - FtpInboundFileSynchronizer Comparator-Konfiguration mit DSL
Die Spring-Integration FtpInboundFileSynchronizerermöglicht die Einstellung von a Comparator<FTPFile>, um das Bestellen der Downloads zu ermöglichen. Die Dokumentation sagt:
Ab Version 5.1 kann der Synchronizer mit einem Comparator versehen werden. Dies ist nützlich, wenn Sie die Anzahl der mit maxFetchSize abgerufenen Dateien einschränken.
Dies ist in Ordnung für die @Bean-Konfiguration:
@Bean
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer(...)
FtpInboundFileSynchronizer synchronizer = new FtpInboundFileSynchronizer(sessionFactory);
...
synchronizer.setComparator(comparator);
return synchronizer;
}
Aber wenn ich Flows programmgesteuert zusammenstellen möchte, wird Java DSL empfohlen.
StandardIntegrationFlow flow = IntegrationFlows
.from(Ftp.inboundAdapter(ftpFileSessionFactory, comparator)
.maxFetchSize(1)
...
Der Komparator in der Ftp.inboundAdapter(...)Factory-Methode dient nur zum lokalen Vergleich von Dateien, nachdem sie heruntergeladen wurden. Es gibt Konfigurationseinstellungen, die hier an den Synchronizer übergeben werden (wie Remote-Verzeichnis, Zeitstempel usw.). Es gibt jedoch keine Einstellung für den Synchronizer, die der obigen Einstellung entspricht.
Lösungsversuch:
Die Alternative besteht darin, den Synchronizer als Nicht-Bean zu erstellen, den FtpInboundFileSynchronizingMessageSourceauf ähnliche Weise zu erstellen und ihn IntegrationFlows.from(source)zum Zusammenbauen des Synchronizers zu verwenden, was zu einer Laufzeitausnahme führt, wenn der Flow im Flow-Kontext registriert wird:
Creating EvaluationContext with no beanFactory
java.lang.RuntimeException: No beanFactory
at org.springframework.integration.expression.ExpressionUtils.createStandardEvaluationContext(ExpressionUtils.java:90) ~[spring-integration-core-5.3.2.RELEASE.jar:5.3.2.RELEASE]
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.afterPropertiesSet(AbstractInboundFileSynchronizer.java:299) ~[spring-integration-file-5.3.2.RELEASE.jar:5.3.2.RELEASE]
Das macht Sinn; das FtpInboundFileSynchronizersoll nicht außerhalb eines Kontextes konstruiert werden. (Obwohl dies zu funktionieren scheint.) Aber wie kann ich in diesem Fall dynamisch FTP-Integrationsflüsse mit einem Synchronizer zusammenstellen, der mit einem konfiguriert ist Comparator<FTPFile>?
Antworten
Sieht so aus, als hätten wir es versäumt, diese remoteComparatorOption in DSL anzubieten.
Fühlen Sie sich frei, ein GH-Problem anzusprechen oder sogar eine Lösung beizutragen:https://github.com/spring-projects/spring-integration/issues
Als Problemumgehung für dynamische Flows würde ich wirklich vorschlagen, separat zu gehen FtpInboundFileSynchronizerund FtpInboundFileSynchronizingMessageSourcedann die erwähnte IntegrationFlows.from(source). Was Sie wahrscheinlich in Ihrer Konfiguration vermissen, ist diese API:
/**
* Add an object which will be registered as an {@link IntegrationFlow} dependant bean in the
* application context. Usually it is some support component, which needs an application context.
* For example dynamically created connection factories or header mappers for AMQP, JMS, TCP etc.
* @param bean an additional arbitrary bean to register into the application context.
* @return the current builder instance
*/
IntegrationFlowRegistrationBuilder addBean(Object bean);
Ich meine, das FtpInboundFileSynchronizingMessageSourceist in Ordnung, um es unverändert weiterzugeben , muss from()aber synchronizerals zusätzliche Bean für die Registrierung hinzugefügt werden.
Eine andere ausgefallenere Möglichkeit ist die Verwendung einer neuen Funktion namens DSL-Erweiterungen:https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/dsl.html#java-dsl-extensions
Sie können dies also erweitern, FtpInboundChannelAdapterSpecum eine verpasste Option zum Konfigurieren für eine interne synchronizer.