2016-05-04 9 views
1

Ich habe eine Feder Batch-Anwendung, die aus der Datei liest, macht einige Verarbeitung und schließlich einen benutzerdefinierten Ausgang schreiben. Dies alles geschieht in einem Schritt. Im nächsten Schritt habe ich ein Tasklet, das die Eingabedateien archiviert (in einen anderen Ordner verschieben). Diese Anwendung funktioniert gut. Aber, jetzt habe ich eine Anforderung zu sftp Ausgabedateien auf einem Remote-Server, wo sie weiterverarbeitet werden. Ich habe einen Weg zu sftp mit Feder-Integration, wo ich einen Eingangskanal erstellt, die zu Outbound-Channel-Adapter führt. Ich lege meine Dateien als Nutzlast in die Nachricht und sende Nachrichten an den Kanal. Das einzige Problem, das ich hier sehe, ist, dass ich jedes Mal, wenn ich den Kontext bekomme, die Federkonfigurationsdatei laden muss, was eine Art hackischer Weg scheint, die Aufgabe zu erledigen. Kennt irgendjemand irgendeine Weise, SI mit SB zu integrieren.mit Feder Integration mit Feder Batch

Lassen Sie mich wissen, wenn Sie meine Konfig sehen möchten ... Vielen Dank im Voraus!

Code den gleichen App-Kontext zuzugreifen, ohne die Feder Config wieder geladen

public class AppContextProvider implements ApplicationContextAware{ 

    private static ApplicationContext ctx; 

    public ApplicationContext getApplicationContext() { 
     return ctx; 
    } 

    public void setApplicationContext(ApplicationContext appContext) throws BeansException { 
     ctx = appContext; 
    } 
} 

Code, um die Ausgabedatei Push-Server SFTP

log.info("Starting transfer of outputFile : " + absoluteOutputFileName); 
final File file = new File(absoluteOutputFileName); 
final Message<File> message = MessageBuilder.withPayload(file).build(); 
AppContextProvider context = new AppContextProvider(); 
final MessageChannel inputChannel = context.getApplicationContext().getBean("toChannel",MessageChannel.class); 
inputChannel.send(message); 
log.info("transfer complete for : " + absoluteOutputFileName); 

Antwort

4

Werfen Sie einen Blick auf die spring-batch-integration Modul innerhalb der Spring Batch-Projekt. Dort haben wir Komponenten zum Starten von Jobs über Nachrichten. In Ihrer Situation würden Sie die Datei per FTP übertragen und dann den Job JobLaunchingMessageHandler starten lassen.

Sie können auch dieses Video von einem Gespräch sehe ich zu diesem Thema vor bei SpringOne ein paar Jahren co-präsentiert: https://www.youtube.com/watch?v=8tiqeV07XlI

+0

Vielen Dank für Ihren Kommentar. Ich werde es durchgehen, In der Zwischenzeit habe ich einen Weg gefunden, den gleichen App-Kontext meiner Bewerbung zu bekommen. Bitte schlagen Sie vor, ob es der richtige Weg ist oder ob Sie Probleme damit haben. den Code in meiner ursprünglichen Frage hinzugefügt –

+0

Warum erstellen Sie einen ApplicationContext pro Job, den Sie ausführen? –

+0

Ich erstelle keinen ApplicationContext pro Job. Ich lade die Spring-Konfiguration einmal und dann für jede Datei ich den Job nacheinander aufrufen. (Ich überprüfe Ordner für verfügbare Dateien und eine Schleife) –

0

Wie Michael sagte, werden Sie auf jeden Fall spring-batch-integration an und Hebelwirkung zu suchen. Wir verwenden Spring Integration als eine Art Wrapper, um 100% unserer Spring Batch-Jobs zu starten.

Ein besonders hilfreicher Anwendungsfall ist die Nutzung der spring-integration-file Inbound Channel Adapter, um Staging-Verzeichnisse abzufragen, die anzeigen, wenn eine neue Batch-Datei gelandet ist. Wenn der Poller eine neue Datei findet, starten wir einen neuen Batch-Job mit dem Eingabedateinamen als Parameter.

Dies war eine echte Hilfe, wenn es um Neustart geht, weil wir jetzt eine Jobinstanz pro Datei haben, anstatt einen Job in willkürlichen Intervallen zu starten und dann über viele Dateien im Staging-Ordner zu partitionieren . Wenn jetzt während der Verarbeitung eine Ausnahme auftritt, können Sie einen bestimmten Job sofort für einen Neustart auswählen, anstatt auf 99 der 100 "guten" Dateien zu warten, um als Erstes fertig zu werden.

+0

@ Dean Können Sie den Code teilen, die Sie verwendet haben, um Ihren Job aufzurufen durch SI? –

+0

Leider ist es an dieser Stelle proprietär, aber wir sind gerade dabei, einige projektspezifische Teile des Codes zu bereinigen, damit wir ihn mit der Community teilen können ... hoffentlich innerhalb von ein paar Monaten. –