Apache Camel Iteration über Liste
Ich bin neu in Apache Camel und ich habe Probleme zu verstehen, wie, um eine einfache Implementierung integration Aufgabe:
- Einen REST service aufrufen einer Spring Bean über Apache Camel route
- Spring Bean gibt eine Sammlung von Klassen (ArrayList)
Muss ich Durchlaufen jedes Element in der Kollektion und konvertieren Sie es zu einer anderen Art durch die benutzerdefinierte Konverter.
Es scheint, dass ich verwenden soll, Split, ein Aggregator, aber wie kann ich die Einschränkung Aggregator zu konsumieren, alle Elemente aus der ursprünglichen Liste, nicht mehr, nicht weniger. Auch, wie kann ich konvertieren von einem Element auf ein anderes? Sollte ich eine Art Converter?
Kann jemand mir ein einfaches Beispiel?
UPDATE 1
Sorry, musste ich rückgängig machen, die Akzeptanz der zur Verfügung gestellten Beispiel, da ist es eigentlich nicht die Antwort auf meine Frage. Hier ist der use-case-Qualifikation:
Ich muss geteilt werden und verwandeln einen Rückgabewert der Methode von to("bean:someBean")
Aufruf anstatt split und transformieren von input-Werte von einigen Endpunkt.
Also der Anwendungsfall ist
- Nennen Endpunkt; e.g GET-Anforderung an rest-service, in meinem Fall:
from("endpoint")
- Aufruf einer bean und erhalten, es ist return Wert; wie
List
,to("bean:someBean")
) - Verwandeln zurückgegebenen Wert zu einem anderen
List
- Kehren verwandelt zurück
List
Verbraucher
UPDATE 2
So, ich kann bestätigen, als mit end()
Methode löst nicht mein problem.
Hier ist der code:
rest("some/service").get().produces("application/json").to("bean:someBean?method=getListOfObjects").route().split(body(), (oldExchange, newExchange) -> {
List<ObjectToConvert> oldList = oldExchange.getIn(List.class);
List<NewObject> convertedList = taskList.stream().map(ObjectToConvert::new).collect(Collectors.toList());
newExchange.getOut().setBody(convertedList);
return newExchange;
}).end();
Unter Verwendung dieser Art der route erhalte ich die folgende Ausnahme auf dem application server:
19:30:21,126 ERROR [org.jboss.as.controller.management-operation] (XNIO-1 task-5) JBAS014613: Operation ("full-replace-deployment") failed - address: (undefined) - failure description: {"JBAS014671: Failed services" => {"jboss.undertow.deployment.default-server.default-host./CamundaLearningCamel" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./CamundaLearningCamel: Failed to start service
Caused by: java.lang.RuntimeException: org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route2 at: >>> Split[{body} -> []] <<< in route: Route(route2)[[From[rest:get:task/all?produces=application%2... because of Definition has no children on Split[{body} -> []]
Caused by: org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route2 at: >>> Split[{body} -> []] <<< in route: Route(route2)[[From[rest:get:task/all?produces=application%2... because of Definition has no children on Split[{body} -> []]
Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route route2 at: >>> Split[{body} -> []] <<< in route: Route(route2)[[From[rest:get:task/all?produces=application%2... because of Definition has no children on Split[{body} -> []]
Caused by: java.lang.IllegalArgumentException: Definition has no children on Split[{body} -> []]"}}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein vollständiges Beispiel teilt aggregiert und konvertiert eine Liste Nachricht.
allen geteilten Nachrichten in der ursprünglichen exchange. Also der splitter ist nur
die Aggregation der Nachrichten der jeweiligen Liste(exchange) senden im "direct:start". Sie haben, um einen benutzerdefinierten
aggregation-Strategie, weil das standardmäßig die ursprünglichen
Austausch, in meinem Beispiel InOrder. Die aggregation-Strategie ist die
zweites argument der split-definition.
Art Konverter gibt uns die Möglichkeit, in convertBodyTo
DSL. Sie kann auch erreichen, dass Sie mit einer bean,Prozessor oder alles tun, die Transformationen in die benutzerdefinierte aggregation-Strategie.
to("bean:someBean")
invovation eher als split und transformieren von input-Werte von Endpunkt. Also der Fall ist 1) nenne einige Endpunkt (rest in meinem Fallfrom("endpoint")
) 2) rufen Sie einige Bohnen und erhalten, es ist return-Wert (es ist Listeto("bean:someBean")
3) transformieren zurückgegebene Wert in eine andere Listeend()
Methode. Danke, ich werde versuchen, es zu verwenden und zu schreiben, ob es funktioniert.end()
nicht helfen.sind Sie richtig mit splitter und aggregator, der "Split-Aggregat Anfrage/Antwort-Muster" ab http://camel.apache.org/splitter.html zeigt, was Sie brauchen.
Brauchen Sie einen "umgebauten" Liste der Objekte, die nach dem splitter?
Wenn ja, den Punkt "die Verwendung einer Liste in AggregationStrategy" von http://camel.apache.org/aggregator2.html sieht die richtige für Ihre Bedürfnisse.
freundlichen GRÜßEN,
soilworker
inputList.size()
Nachrichten zu kommenFür die Zukunft, eine weitere Möglichkeit zum iterieren über eine Liste mit den
loop
konstruieren der Java-DSL. Hier ist ein Beispiel:Den
LOOP_INDEX
- Eigenschaft enthält die aktuelle iteration, beginnend bei 0 bis zu der LIST_LENGHT header-Wert, so können Sie es verwenden, um das aktuelle element aus der Liste.Beachten Sie die Doppel -
end()
Methode nennen: die eine ist für das Ende der Schleife und das andere Ende der route.Dokumentation: http://camel.apache.org/loop.html