2017-02-23 48 views
0

Я пытаюсь получить ответ от веб-службы REST, размещенной на http://localhost:8089/mock/success, и написать ответ на файл, используя Camel. Вот маршрут я написал в Java дляКак написать ответ веб-службы в файл с помощью верблюда?

кампании с таким же
from("direct:start") 
    .to("http://localhost:8089/mock/success") 
    .to("file://D:/tmp/restoutput"); 

Вот как я это применением маршрутные

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(); 
} 

Я не получаю никаких исключений, но ничего не добавляется в файл , Я довольно новичок в Camel, поэтому я не могу угадать проблему. Кто-нибудь может мне с этим помочь?

Используя таймер, основанный на предложениях, я получаю исключение для исключения нулевого указателя при записи в файл. Вот модифицированного код-

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

Как @claus упоминает, как ваш маршрут должен срабатывать? direct-start - это просто очередь в памяти. Что-то нужно надеть. Для простоты вы можете просто взять файл, отбросить его на маршруте и продолжить. Или используйте таймер. –

+0

@SoucianceEqdamRashti: Я не могу использовать таймер. Что касается 'direct: start', я неверно истолковал документацию. – Abhishek

+0

Добавить записи журнала после первого .to() и посмотреть, что содержит тело и заголовки, прежде чем писать в файл. Что значит таймер не работает? Он не срабатывает? –

ответ

1

Вам нужно либо отправить сообщение на прямой конечной точке, или если вы просто хотите назвать это конечная точка один раз, вы можете использовать таймер и установить его repeatCount=1 запустить только один раз: http://camel.apache.org/timer

Для вызова прямая конечная точка вы можете использовать ProducerTemplate. Посмотрите/ищите документацию Camel еще несколько примеров.

+0

Я могу получить ответ, используя 'ProducerTemplate'. Но я все еще не могу использовать таймер. Я добавляю код. Не могли бы вы посмотреть, что случилось? – Abhishek

+0

Я не рекомендую маршрут, если вы просто хотите вызвать http и сохранить файл. Просто используйте ProducerTemplate для вызова HTTP и сделайте то же самое, чтобы сохранить файл. Вы можете просто отправить тело из ответа HTTP как тело в конечную точку файла с шаблоном производителя –

+0

Я был настолько наивен ранее, что не понял, что вы пытались сказать. Благодарю. – Abhishek

1

Согласно документации ответа на HTTP-компоненте хранится в выездной части обмена. Причина, по которой ваш файл пуст, заключается в том, что он пишет часть.

Вы могли бы попробовать что-то вроде этого, чтобы скопировать из-тело в-части:

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

Я не используется для написания маршрутов в Java DSL, но это должно выглядеть примерно так, что если я м не ошибаюсь.

+0

Как это использовать? – Abhishek

0

Итак, наконец, он получил работу с помощью всех ответов. Ниже приведен последний рабочий код.

  1. Использование Routes-

    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. Использование ProducerTemplate-

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

второй не записывает его в файл, хотя. Это можно сделать легко, используя стандартный файл api java.

+0

Я все еще не понимаю, почему вы выбрали обмен. Вы можете использовать его в обмен на свой жизненный цикл. –

+0

Я думаю, потому что я ноот! Спасибо за подсказку @SoucianceEqdamRashti – Abhishek