1

Ich habe Spring mit SFTP-Integration erfolgreich eingerichtet und binde einen SFTP-Server und zieht Dateien herunter.Spring-Integration SFTP - Post-Transfer-Verarbeitung

Was ich gerne wissen würde, ist es möglich, dass eine Aufgabe auf jede Datei gefeuert wird, sobald der Download abgeschlossen ist? Ich möchte nicht auf die Straße von Dateisystem-Uhren gehen - ist da etwas eingebaut in Spring SFTP?

Nachdem wir uns die Dokumentation angesehen haben, sieht es so aus, als ob sie mit Channels erreicht werden kann.

Dies ist, was mein Empfängerkanal sieht derzeit wie:

<int:channel id="receiveChannel"> 
    <int:queue /> 
</int:channel> 

Ich bin nicht sicher, was ich einen Kunden Abfangjäger oder ähnliches Feuer tun müssen.

Edit: von dem Frühlings-docs sagt es so:

Es ist auch wichtig zu verstehen, dass SFTP Inbound-Channel-Adapter ein Polling Consumer ist und deshalb müssen Sie einen poller (entweder einen globalen Standard oder einem lokale Konfiguration Unterelement). Sobald die Datei in ein lokales Verzeichnis übertragen wurde, wird eine Nachricht mit java.io.File als Payload-Typ generiert und an den Kanal gesendet, der durch das Kanalattribut identifiziert wird.

Ich bin nicht sicher, wie man das umsetzt - und kann keine Beispiele finden.

Antwort

0

Zum Vorteil anderer, die auf dieses Problem stoßen, besteht das Problem darin, dass die Nachrichten nur dann auf den empfangenen Kanal gesetzt werden, wenn ALLE Dateien übertragen wurden. Sie werden nicht einzeln behandelt (wie ich es erwartet hatte). In meinem Fall habe ich Tausende von großen Dateien auf einem entfernten SFTP-Server, und erst nachdem alle heruntergeladen wurden, wurden die Nachrichten an den Empfängerkanal gesendet.

Ich bin mir nicht sicher, ob dies beabsichtigt ist.

1

Sieht so aus, als müssten Sie am Anfang von Enterprise Integration Patterns beginnen und für sich selbst feststellen, dass channel der wichtigste Bürger erster Klasse in der Integration ist.

So haben Sie eine <int-sftp:inbound-channel-adapter>, die Verantwortung zu Umfrage Entitäten aus dem Remote-Verzeichnis, drehen sie auf die java.io.File (wie Sie in der RTFM bemerkt) und als payload von Message an den konfigurierten Kanal senden. Der Teilnehmer für diesen Kanal wird die Nachricht aufnehmen und einen gewünschten Prozess unter diesem Filepayload durchführen.

Siehe auch Spring Integration Samples für weitere Informationen.

+0

Hmm, ich habe das in meiner gelöschten Antwort versucht, und ich dachte, es funktioniert. Die Sendeereignisse sind jedoch die einzigen, die ausgelöst werden und nur wenn ich die Anwendung neu starte. –

+0

Bitte lesen Sie mehr Dokumentation und folgen Sie den Beispielen. Sie sehen Ereignisse nur beim Start, nur weil während der Anwendung keine neuen Dateien im Remote-Verzeichnis vorhanden sind. Sie sollten wirklich einen '', nicht 'Interceptor' machen. Ich bin mir nicht sicher, warum Sie meine Antwort als nicht ausreichend für die Frage finden. Wir "sprechen" nur verschiedene Sprachen und möchten, dass wir in Ihrer Bewerbung für Sie arbeiten, wenn es gerade genug ist, um einige Dokumente zu lesen und mit einem geeigneten Muster zu trainieren. –

+0

Danke Artem - Ich habe auf Service-Aktivator umgestellt. Die Methode wird jedoch nur beim Neustart des Systems ausgelöst.Von den Dokumenten, die ich dachte, es würde feuern, wenn die Datei vollständig heruntergeladen wurde - Entschuldigung, ich versuche, den Dokumenten zu folgen und nicht darum zu bitten, dass dies für mich erledigt wird. –