如何使用驼峰写入文件的Web服务响应?

时间:2017-02-23 08:29:08

标签: java apache-camel

我正在尝试从http://localhost:8089/mock/success托管的REST Web服务获取响应,并使用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");

3 个答案:

答案 0 :(得分:1)

根据文档,http组件的响应存储在交换机的外部。您的文件为空的原因是因为它正在编写部分内容。

您可以尝试这样的方法将外体复制到部分内容:

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

我不习惯在Java DSL中编写路由,但如果我没有弄错的话,它应该看起来像那样。

答案 1 :(得分:1)

您需要向直接端点发送消息,或者如果您只想呼叫该端点一次,则可以使用计时器并将其repeatCount=1设置为仅运行一次:http://camel.apache.org/timer

要调用直接端点,您可以使用ProducerTemplate。查看/搜索Camel文档以获取更多示例。

答案 2 :(得分:0)

所以,最后让它在所有答案的帮助下工作。下面显示的是最终工作代码。

  1. 使用路线 -

    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)
    
  3. 第二个不会将其写入文件。可以使用java的标准文件api轻松完成。