Ich habe einen Integrationsfluss, bei dem einige der Schritte asynchron und einige synchron sind. Ich möchte die barrier
verwenden, um den Thread Main
zu blockieren, bis alle asynchronen Tasks abgeschlossen sind. Basierend auf der Dokumentation gibt es zwei Möglichkeiten, die Barriere zu verwenden.Verwenden der Sperre, um auf den Abschluss des Integrationsflusses zu warten
- Eine zweite Auslösenachricht an den Eingangskanal der Schranke senden.
- die Trigger Methode Invoke manuell der Barriere
In meinem Anwendungsfall eine Meldung in der Strömung kommt und geht dann durch mehrere Komponenten, bis sie den completed
Kanal erreicht. Ich möchte, dass der Haupt-Thread blockiert wird, bis die ursprünglichen Nachrichten den abgeschlossenen Kanal erreichen. Daher erscheint es sinnvoll, die Option # 2 zu verwenden und die Barrier-Trigger-Methode aufzurufen, nachdem der completed
-Status erreicht wurde. Das scheint nicht zu funktionieren. Hier ist eine vereinfachte Version meines Flow.
<int:gateway
service-interface="...BarrierGateway"
id="barrierGateway" default-request-channel="input">
</int:gateway>
<int:channel id="input">
<int:dispatcher task-executor="executor" />
</int:channel>
<int:service-activator input-channel="input" output-channel="completed">
<bean class="...BarrierSA" />
</int:service-activator>
<int:channel id="completed" />
<int:service-activator input-channel="completed"
ref="barrier1.handler" method="trigger" />
<int:barrier id="barrier1" input-channel="input" timeout="10000" />
ich eine Nachricht an die gateway
senden, die es den input
Kanal verläuft, der einen dispatcher
so einen neuen Thread verwendet wird gestartet, nach vorne um die Nachricht zu übergeben. An dieser Stelle möchte ich den main
Thread blockieren, während der Executor-1
Thread den Fluss durchläuft. Der Rest des Flusses ist einfach. Mein service-activator
schläft für 3 Sekunden, bevor die Nachricht zurückgegeben wird, um eine Verzögerung zu simulieren. Sobald die Nachricht im Kanal completed
empfangen wurde, sollte der Service-Aktivator die Methode barrier trigger
aufrufen und nur zu diesem Zeitpunkt sollte der Haupt-Thread freigegeben werden. Stattdessen wird der Hauptthread freigegeben, nachdem der Dispatcher einen neuen Thread gestartet hat. Ich habe versucht, eine konstante Korrelationsidentifikation ('abc') zu spezifizieren, aber das half nicht.
Die Barriere ist für anspruchsvollere Umgebungen; Für einen einfachen Anwendungsfall, wie @Artem sagt, wird der Hauptthread im Gateway ausgesetzt (wenn es einen Rückgabetyp von der Methode gibt), bis der Fluss endet (unabhängig von Async-Handoffs) oder bis die Antwort Timeout "ist überschritten - das ist standardmäßig Unendlich. Wenn Sie einen Leerverkauf haben, dann ist die Barriere die richtige Lösung, aber jede Seite der Barriere muss auf einem separaten Thread laufen, wie Artem sagt. –