2016-08-09 82 views
1

Ich muss eine Sammlung in MongoDB basierend auf Werten von Webservices, die JSON bereitstellen, füttern, aber ich habe Probleme beim Mounten des Jobs, da der URI einiger Webdienste darauf angewiesen ist auf Werten, die von anderen Webservices erhalten werden können. Zum Beispiel kann die URI http://172.31.15.180:80/ws/getAgenciasUF/52 ein JSON mit einer Sammlung, in diesem Format:Talend - URI basierend auf Werten aus einer Liste

{ "COD_AGENCIA", "521800300", "NAME", "PORANGATU", "UORG": "902", "INTRA_MUNICIPAL": "0"}, 
{ "COD_AGENCIA", "521830000", "NAME", "HOLD", "UORG": "904", "INTRA_MUNICIPAL": "0"} 
... 
(20 other values) 
... 

Durch diese webservice, ich Einsatz in einer MongoDB Sammlung mit dem Trest und tExtractJSONFields Komponenten haben könnte. Es gibt jedoch einen anderen Webservice, dessen URI http://172.31.15.180:80/ws/getCidadesPorAgencia/521800300 ist, wobei letzterer Wert für COD_AGENCIA steht, der in JSON oben verfügbar ist. Das heißt, wenn ich den COD_AGENCIA nach oben lese und eine Komponente einfüge, die auf diese Werte iteriert und x mal den zweiten URI aufnimmt, variiere nur den Code, könnte ich alle Werte erhalten, die benötigt werden, um eine andere Sammlung MongoDB zu füttern.

Mit der ESB TOS 6.2.1 habe ich versucht, eine Trest zu verbinden eine tExtractJSONField und dies zu einem tRESTRequest, wie folgt aus:

my job

aber ich erhielt den folgenden Fehler:

[statistics] connecting to socket on port 3587 
[statistics] connected 

[WARN ]: org.eclipse.jetty.util.component.AbstractLifeCycle - FAILED [email protected]:80: java.net.BindException: Cannot assign requested address: bind 
java.net.BindException: Cannot assign requested address: bind 
at sun.nio.ch.Net.bind0(Native Method) 
at sun.nio.ch.Net.bind(Unknown Source) 
at sun.nio.ch.Net.bind(Unknown Source) 
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source) 
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:187) 
at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:316) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:265) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 
at org.eclipse.jetty.server.Server.doStart(Server.java:293) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:472) 
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.activate(JettyHTTPDestination.java:175) 
at org.apache.cxf.transport.AbstractObservable.setMessageObserver(AbstractObservable.java:53) 
at org.apache.cxf.binding.AbstractBindingFactory.addListener(AbstractBindingFactory.java:95) 
at org.apache.cxf.jaxrs.JAXRSBindingFactory.addListener(JAXRSBindingFactory.java:88) 
at org.apache.cxf.endpoint.ServerImpl.start(ServerImpl.java:123) 
at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:206) 
at bdogo.teste_0_1.teste$Thread4RestServiceProviderEndpoint.run(teste.java:791) 

[WARN ]: org.eclipse.jetty.util.component.AbstractLifeCycle - FAILED [email protected]: java.net.BindException: Cannot assign requested address: bind 
java.net.BindException: Cannot assign requested address: bind 
at sun.nio.ch.Net.bind0(Native Method) 
at sun.nio.ch.Net.bind(Unknown Source) 
at sun.nio.ch.Net.bind(Unknown Source) 
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source) 
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:187) 
at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:316) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:265) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 
at org.eclipse.jetty.server.Server.doStart(Server.java:293) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:472) 
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.activate(JettyHTTPDestination.java:175) 
at org.apache.cxf.transport.AbstractObservable.setMessageObserver(AbstractObservable.java:53) 
at org.apache.cxf.binding.AbstractBindingFactory.addListener(AbstractBindingFactory.java:95) 
at org.apache.cxf.jaxrs.JAXRSBindingFactory.addListener(JAXRSBindingFactory.java:88) 
at org.apache.cxf.endpoint.ServerImpl.start(ServerImpl.java:123) 
at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:206) 
at bdogo.teste_0_1.teste$Thread4RestServiceProviderEndpoint.run(teste.java:791) 

[ERROR]: org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine - Could not start Jetty server on port 80: Cannot assign requested address: bind 
org.apache.cxf.service.factory.ServiceConstructionException 
at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:219) 
at bdogo.teste_0_1.teste$Thread4RestServiceProviderEndpoint.run(teste.java:791) 

Caused by: org.apache.cxf.interceptor.Fault: Could not start Jetty server on port 80: Cannot assign requested address: bind 
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:483) 
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.activate(JettyHTTPDestination.java:175) 
at org.apache.cxf.transport.AbstractObservable.setMessageObserver(AbstractObservable.java:53) 
at org.apache.cxf.binding.AbstractBindingFactory.addListener(AbstractBindingFactory.java:95) 
at org.apache.cxf.jaxrs.JAXRSBindingFactory.addListener(JAXRSBindingFactory.java:88) 
at org.apache.cxf.endpoint.ServerImpl.start(ServerImpl.java:123) 
at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:206) 
... 1 more 

Caused by: java.net.BindException: Cannot assign requested address: bind 
at sun.nio.ch.Net.bind0(Native Method) 
at sun.nio.ch.Net.bind(Unknown Source) 
at sun.nio.ch.Net.bind(Unknown Source) 
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source) 
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:187) 
at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:316) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:265) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 
at org.eclipse.jetty.server.Server.doStart(Server.java:293) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:472) 
... 7 more 

Wenn ich tRESTRequest eliminiere und das tExtractJSONField direkt mit tLog verbinde, tritt dieser Fehler nicht auf, und die Ausgabe von tExtract wird auf der Konsole aufgelistet. Die Verwendung dieser TRESTRequest-Komponente (die neu für mich ist) ist, dass ich etwas falsch zu sein scheint. Es ist sogar so, dass es verwendet werden sollte (siehe Abbildung unten)?

tRESTRequest

Beachten Sie, dass es eine Warnung in tExtractJSONFields ist (der Text sagt: „Diese Komponente ist nicht genug Zeilentyp Ausgänge“). Die folgenden Abbildungen zeigen, wie die Konfiguration der Komponenten vorgenommen wurde.

Könnte mir helfen, wie man es von Werten konfiguriert, die von tExtractJSONFields empfangen werden? Was mache ich falsch? Es gibt einen anderen Weg, um das gewünschte Ergebnis zu erhalten?

+0

Die Komponente tRestRequest wird verwendet, wenn Sie einen Webservice bereitstellen möchten. Hier scheint es, dass Sie beide Webservices konsumieren wollen, dann sollten Sie tRestClient verwenden. – Corentin

Antwort

1

Ihre Vorgehensweise ist in Ordnung, Ihnen fehlen nur wenige Komponenten.

Job Design

  1. Get Liste der COD_AGENCIA

Die Komponenten Trest und tExtractJSONFields sind gut dafür geeignet.

An dieser Stelle sollten Sie eine Liste aller Werte haben, die Sie mit dem ersten REST-Aufruf erhalten haben.

Jetzt für die Verbindung zwischen dem ersten und dem zweiten Anruf.

  1. Get Liste der getCidadesPorAgencia pro COD_AGENCIA

Hier legen Sie wieder eine Trest Komponente und vielleicht ein tExtractJSONFields nutzen könnten. Auch hier wäre die Stelle, wo tMongoDBOutput zu verwenden ist.

Um beide dieser Anforderungen zu verbinden, verwendet eine tFlowToIterate Komponente nach dem ersten tExtractJSONFields.

einen Schlüsselwert für COD_AGENCIA hinzufügen und die zweite Trest mit Iterate verbinden. Jetzt haben Sie im zweiten tREST Zugriff auf eine globale Variable, die Sie gerade als Schlüsselwert benannt haben. Verwenden Sie dies in dem Anruf, z. B .: "http://172.31.15.180:80/ws/getCidadesPorAgencia/" + globalMap.get("var_agencia")"

Jetzt sollten Sie in der Lage sein, jede Agentur durchlaufen und alle Städte damit verbunden werden.

Grund

Was Sie war eine gute Idee hat, aber der falsche Anschluss. OnComponentOk wartet, bis die verbundene Komponente ohne Fehler durchlaufen wird. Dann wird die nächste Komponente gestartet. Es werden keine Daten übertragen. Und keine Reihe Iteration wird passieren, die hier scheint der Schlüssel zu sein.

+0

Vielen Dank, tobi6, Ihre Tipps haben mir sehr geholfen! Ich habe es geschafft, alle Städte zu bekommen und sie auf einem tLog zu drucken. Der Job bringt jedoch alle Werte auf einmal. Wie würde ich für jede Iteration die Werte jeder Agentur so vorbereiten, dass sie in separate Sammlungen aufgenommen werden? Mit anderen Worten, jede Iteration (jede Agentur), die in der Lage ist, einen JSON mit Werten zu erzeugen, die nach Agentur getrennt sind, fügt dann die MongoDB ein? –

+0

Beim Ersetzen von tLog für tFileOutputJSON enthielt die generierte Datei nur die letzten Iterationsstädte. Wie generiert man mehrere JSON-Objekte, eines für jede Agentur und ihre Sammlung von Städten? –

+0

Kein Problem. Dies hängt stark von Ihrem Jobdesign und Ihrer Anforderung ab, die ich nicht vollständig verstanden habe. Jede Agentur sollte ihre Werte bereits bereitstellen und eine Einheit sein, die in MongoDB eingefügt werden kann. – tobi6