2017-02-23 4 views
0

Ich versuche, die Antwort von einem REST-Webservice abzurufen gehostet http://localhost:8089/mock/success und schreiben Sie die Antwort auf eine Datei mit Camel. Hier ist der Weg, den ich in Java geschrieben habe für die gleichgeschlechtlichenWie schreibe Web-Service-Antwort auf Datei mit Kamel?

from("direct:start") 
    .to("http://localhost:8089/mock/success") 
    .to("file://D:/tmp/restoutput"); 

hier, wie ich bin Berufung auf diese Routen-

CamelContext ctx = new DefaultCamelContext(); 
RouteBuilder routebuilder = new RestToFileRoute(); 
System.out.println("invokeRestToFileRoute() started."); 
try { 
    ctx.addRoutes(routebuilder); 
    ctx.start(); 
    Thread.sleep(1000); 
    ctx.stop(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Ich habe keine Ausnahmen bekommen, aber nichts in die Datei hinzugefügt . Ich bin ziemlich neu in Camel, daher kann ich das Problem nicht erraten. Kann mir jemand dabei helfen?

Mit dem Timer basierend auf Vorschlägen, bekomme ich Null Zeiger Ausnahme beim Schreiben in Datei. Hier ist die modifizierte Code-

from("timer://simpleTimer?repeatCount=1") 
    .to("http://localhost:8089/mock/success") 
    .process(exchange -> {System.out.println("Message: " + exchange.getOut().getBody(String.class));}) // Output: "Message: null" 
    .to("file://D:/tmp/restoutput"); 
+0

Wie @claus Erwähnungen, wie soll Ihre Route ausgelöst werden? Direktstart ist nur eine In-Memory-Warteschlange. Etwas muss darauf gelegt werden. Der Einfachheit halber können Sie einfach eine Datei auswählen, in der Route verwerfen und fortfahren. Oder verwende einen Timer. –

+0

@SoucianceEqdamRashti: Ich kann den Timer nicht verwenden. Was "direct: start" betrifft, habe ich die Dokumentation falsch interpretiert. – Abhishek

+0

Fügen Sie Protokollanweisungen nach der ersten .to() hinzu und sehen Sie, was der Text und die Header enthalten, bevor Sie sie in die Datei schreiben. Was meinst du, der Timer funktioniert nicht? Es wird nicht ausgelöst? –

Antwort

1

Sie müssen entweder eine Nachricht an den direkten Endpunkt senden, oder wenn Sie nur diesen Endpunkt einmal anrufen möchten, können Sie den Timer nutzen und dessen repeatCount=1 nur einmal auszuführen: http://camel.apache.org/timer

zu nennen, die direkten Endpunkt können Sie ProducerTemplate verwenden. Suchen Sie in der Camel-Dokumentation nach weiteren Beispielen.

+0

Ich kann die Antwort mit 'ProducerTemplate' erhalten. Aber ich kann den Timer immer noch nicht benutzen. Ich füge den Code hinzu. Kannst du bitte schauen, was los ist? – Abhishek

+0

Ich empfehle keine Route, wenn Sie nur ein http aufrufen und in Datei speichern möchten. Verwenden Sie einfach ProducerTemplate, um das HTTP aufzurufen, und machen Sie dasselbe, um die Datei zu speichern. Sie können nur den Körper von der HTTP-Antwort, wie der Körper auf die Datei Endpunkt mit dem Hersteller Vorlage senden –

+0

ich früher so naiv war, dass ich nicht verstehe, was Sie sagen wollten. Vielen Dank. – Abhishek

1

Gemäß der Dokumentation der Antwort für die http-Komponente in dem Out-Teil des Austausches gespeichert ist. Der Grund, warum Ihre Datei leer ist, liegt darin, dass sie den In-Abschnitt schreibt.

Man könnte so etwas wie diese versuchen, die out-Körper der in-Teil zu kopieren:

.setBody(simple("${out.body}")) 
.to("file://D:/tmp/restoutput"); 

Ich bin nicht zum Schreiben Routen in Java DSL verwendet, aber es sollte so ähnlich aussehen, wenn ich Ich irre mich nicht.

+0

Wie benutze ich das? – Abhishek

0

So, endlich hat es mit Hilfe aller Antworten zu arbeiten. Nachstehend ist der endgültige Arbeitscode angegeben.

  1. Mit Routen-

    from("timer://simpleTimer?repeatCount=1") 
        .to("http://localhost:8089/mock/success") 
        .process(exchange -> { 
          String response = exchange.getIn().getBody(String.class); 
          exchange.getOut().setBody(msg); 
        }) 
        .to("file://D:/tmp/?fileName=restoutput"); // This was missing earlier 
    
  2. Mit ProducerTemplate-

    ProducerTemplate template = new DefaultCamelContext().createProducerTemplate(); 
    Exchange exchange = template.request("http://localhost:8089/mock/success", exchangeObjcet -> {}); 
    String response = exchange.getOut().getBody(String.class) 
    

Die zweite man es nicht schreiben, obwohl Datei. Es kann leicht mit der Standard-Datei API von Java getan werden.

+0

Ich unterzeichne immer noch nicht, warum Sie den Out-Exchange einstellen. Sie können das im Austausch über Ihren Lebenszyklus nutzen. –

+0

Ich denke, weil ich ein Noob bin! Danke für den Tipp @SoucianceEqdamRashti – Abhishek