2016-07-13 8 views
1

ich zwei kleine Frühlings-Boot-Anwendungen unter BerücksichtigungVerarbeitung Antwort von externen Web-Service mit Apache Camel

  • applcation 1: Eine kleine Web-Service auf http://localhost:8081 ausgeführt wird, reagiert eine einfache Feder-Controller Implementierung Anforderungen an GET auf/Kamel. Der Service gibt einfach "Hallo Welt" zurück, wenn er http://localhost:8081/camel besucht.
  • Anwendung 2: Eine kleine Anwendung, die eine GET-Anforderung an Anwendung 1 ausführen und die Antwort an die Konsole (in diesem Fall "Hallo Welt") ausdrucken sollte.

Verwendung von Federn RestTemplate, kann ich einfach diese GET-Anfrage in Anwendung implementieren 2:

RestTemplate template = new RestTemplate(); 
String response = template.getForBody("http://localhost:8081/camel", String.class); 
System.out.println(response); 

Mein Ziel jetzt RestTemplate Apache Camel verwenden anstelle von Spring ist. Ich habe versucht, die folgenden RouteBuilder definieren:

public class MyRoutes extends RouteBuilder { 
    @Override 
    public void configure() throws Exception() { 
     from("jetty:http://localhost:8081/camel").to("direct:processRest"); 

     from("direct:processRest").process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       System.out.println(exchange.getIn().getBody()); 
      } 
     }); 
    } 
} 

Wenn ich die Anwendung jedoch laufen, erhalte ich folgende Fehlermeldung:

org.apache.camel.spring.boot.CamelSpringBootInitializationException: java.net.BindException: Address already in use: bind 

Entweder Frühlings-Boot oder Apache Camel automatisch einen Jetty-Server zu starten versucht, an Port 8081, aber der andere Webservice (Anwendung 1) läuft bereits auf diesem Port.

Weiß jemand, wie man dieses Problem vermeidet?

Antwort

0

Das Problem, das Sie erleben, rührt von der Tatsache her, dass Sie die Jetty-Komponente von Camel als Consumer verwenden, die einen eingebetteten Jetty-Server anzeigt und ihn an Port 8081 bindet, was zu Konflikten mit Ihrer Spring Boot-App führt. Um HTTP-Anfragen zu senden, sollten Sie Jetty Komponente als Hersteller verwenden, dh Ihre Route Definition ändern etwas wie

from("scheduler:camelTest?delay=1000").to("jetty:http://localhost:8081/camel").to("direct:processRest");

+0

Diese ich schon verstanden sein :) Aber ich verstehe nicht, wie ich Anlegestelle laufen lassen kann an Port 8282, aber verwenden Sie Port 8281 in der Routenspezifikation. Was auch immer ich versuche, Jetty startet immer an dem Port, der in der Route verwendet wird. –

+0

Nun, da Sie von() in der Routen-Deklaration Ihrer Anwendung 2 Gebrauch machen, erstellen Sie einen eingebetteten Jetty und hören Anfragen ab/camel path –

+0

Oh, ** jetzt ** Ich verstehe - Entschuldigung, ich habe deine Frage falsch verstanden. Ich werde meine Antwort sofort aktualisieren. –