2016-10-28 3 views
0

Ich arbeite an einem Projekt mit Spring-Boot, Feder-Batch und Feder-Integration.Job-Launch-Gateway und persistente Warteschlange

Ich habe die Federintegration bereits konfiguriert, um einen Spring-Batch-Job zu starten, wenn eine neue Nachricht eintrifft.

Ich sende eine Nachricht an den Spring-Integration-Kanal, der an den JobLaunchingGateway angeschlossen ist, und für jede Nachricht versuche der JobLaunchingGateway, einen neuen TaskExecutor zu starten.

Lassen Sie den Kanal durch eine beständige Warteschlange (ActiveMQ als Beispiel) Lassen Sie die Task-Testamentsvollstrecker Pool-Größe gleich 2

ich das System konfigurieren mag gesichert werden, so dass, wenn der Vollstrecker pool- Größe wird bereits verwendet Die neuen Nachrichten werden nicht vom JobLaunchingGateway verbraucht, verbleiben jedoch in der persistenten Warteschlange.

Ist es möglich? Gibt es Best Practices?

Jede Rückmeldung wird geschätzt. Vielen Dank im Voraus.

Antwort

0

Sie können der TE ein Warteschlangenlimit hinzufügen und CallerBlocksPolicy' for the RejectedExecutionHandler` verwenden.

Im Falle eines Fehlers verlieren Sie jedoch die Aufgabe (n) in der Warteschlange.

Es ist im Allgemeinen besser, einen messagegesteuerten Kanal zu verwenden, die Nebenläufigkeit auf zwei festzulegen und die Jobs auf dem Thread des Listener-Containers auszuführen, anstatt einen TE zum Ausführen des Jobs zu verwenden.

Der zusätzliche Vorteil ist, wenn der Job fehlschlägt oder der Computer abstürzt, werden Sie diese Anfrage nicht verlieren. Sobald Sie an die TE übergeben haben, ist die Nachricht aus der Warteschlange verschwunden.

+0

Vielen Dank für Ihre schnelle Antwort. Der zweite Weg ist genau das, was ich implementieren möchte, weil ich im Falle eines Absturzes nichts verlieren will. Aber was meinst du mit "den Job auf dem Listener-Container ausführen"? Schlägst du vor, den Job innerhalb einer Implementierung von MessageDelegate auszuführen und dieses MessageDelegate über einen MessageListenerAdapter an den DefaultMessageListenerContainer zu übergeben? Und was denken Sie über eine "Batch-Int: Job-Start-Gateway", die einen JobLouncher mit einem SyncTaskExecutor verwenden? – gdegani

+0

Verwenden Sie keinen Task-Executor, und der Job wird im Listener-Container-Thread des Kanals ausgeführt. Das Framework kümmert sich um alles für Sie. Der 'SubscribeJmsChannel' hat einen Container; Stellen Sie die Nebenläufigkeit so ein, wie Sie es wünschen, und verbinden Sie den Job direkt mit dem Gateway. Wenn Sie immer noch Probleme mit dem Verständnis haben, bearbeiten Sie Ihre Frage mit Ihrer aktuellen Konfiguration, damit Sie jemand weiterleiten kann. –

Verwandte Themen