使用Apache Camel处理外部Web服务的响应

时间:2016-07-13 10:17:23

标签: web-services spring-boot apache-camel

我正在考虑两个小的Spring Boot应用程序:

  • Applcation 1 :在http://localhost:8081上运行的小型Web服务,实现响应/ camel上的GET请求的简单Spring Controller。访问http://localhost:8081/camel时,该服务只返回“Hello world”。
  • 应用程序2 :应该对应用程序1执行GET请求并打印出对控制台的响应的小应用程序(在本例中为“Hello world”)。

使用Springs RestTemplate,我可以轻松地在应用程序2中实现此GET请求:

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

我现在的目标是使用Apache Camel而不是Spring的RestTemplate。 我已经尝试定义以下RouteBuilder:

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

但是,当我运行应用程序时,收到以下错误:

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

Spring Boot或Apache Camel会自动尝试在端口8081上启动Jetty服务器,但其他Web服务(应用程序1)已在此端口上运行。

有人知道如何避免这个问题吗?

1 个答案:

答案 0 :(得分:0)

您遇到的问题来自于您将Camel的Jetty组件用作消费者,这会启动嵌入式Jetty服务器并将其绑定到端口8081,从而与你的Spring Boot应用程序。要发送HTTP请求,您应该使用Jetty组件作为生产者,即将路由定义更改为

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