我正在尝试从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");
答案 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)
所以,最后让它在所有答案的帮助下工作。下面显示的是最终工作代码。
使用路线 -
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
使用ProducerTemplate -
ProducerTemplate template = new DefaultCamelContext().createProducerTemplate();
Exchange exchange = template.request("http://localhost:8089/mock/success", exchangeObjcet -> {});
String response = exchange.getOut().getBody(String.class)
第二个不会将其写入文件。可以使用java的标准文件api轻松完成。