在Jetty Server的现有Spring Boot应用程序中使用Camel

时间:2016-05-07 14:34:20

标签: java apache-camel

我们在嵌入式Jetty服务器中部署了一个spring-boot应用程序,侦听端口X.现在我通过定义路由将Apache Camel集成到现有应用程序中。 目标是将少数休息终点移至将代理到其他服务的骆驼路线。我无法理解以下

  • 当我使用“jetty:http://localhost:Y/myapp”作为路由端点之一时。它没有任何错误。这是否意味着Camel创建了自己的jetty实例?

  • 当我使用“jetty:http://localhost:X/myapp”时 - 它再次起作用而没有给出地址X正在使用的错误

我想保持对jetty服务器配置的控制,让骆驼听听现有的休息终点。

2 个答案:

答案 0 :(得分:2)

如果您可以配置一个匹配所有需要重定向的路径的servlet映射(例如,foo/*之类的路径总是被重定向),那么事情就很容易了。如果这不起作用,我会稍后尝试编辑我的答案。

官方文档is here中的相关页面。有趣的例子是使用servlet component的例子,因为你已经配置并运行了一个servlet容器(Jetty)。

首先,需要配置Camel servlet。这取决于您现有的servlet的配置方式;例如,使用web.xml文件,添加:

<servlet>
  <servlet-name>CamelServlet</servlet-name>
  <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>CamelServlet</servlet-name>
  <url-pattern>/foo/*</url-pattern>
</servlet-mapping>

或者,如果您使用的是spring-boot,则只需注册以下bean:

@Bean
public ServletRegistrationBean servletRegistrationBean() {
    CamelHttpTransportServlet servlet = new CamelHttpTransportServlet("CamelServlet");
    servlet.setServletName();
    return new ServletRegistrationBean(servlet,"/foo/*");
}

无论如何,一旦你的Jetty实例注册了Camel servlet,你就可以使用servlet组件,并重定向一切:

from("servlet:foo?matchOnUriPrefix=true")
.to("http4://new.com/foo?bridgeEndpoint=true&throwExceptionOnFailure=false");
  • http4HTTP4 component,基于Apache HTTPClient 4.x. (如果需要,您仍然可以在HTTPClient 3.x上使用HTTP component
  • matchOnUriPrefix=true将匹配通配符
  • bridgeEndpoint=true表示我们充当代理
  • throwExceptionOnFailure=false表示new服务器返回的错误只会转发给调用者,而不会被Camel处理。

http://old.com/foo/some/crazy/path/i/just/made/up的请求应重定向到http://new.com/foo/some/crazy/path/i/just/made/up(可能会导致来自new.com服务器的404错误,该错误只会转发给初始调用方。)

答案 1 :(得分:1)

Camel不会按照您期望的方式听取“已存在的”端点;它使用方案指示的组件创建自己的组件。你已经创建了一个Jetty端点(即“jetty:...”),因此Camel会旋转一个Camel Jetty组件来处理该端点的HTTP请求。

如果您想使用Camel作为重定向的代理(使用网络负载均衡器可能更容易实现),那么您可以将Camel路由转换为替换现有端点和路由他们到新的端点。   从( “码头:http://oldendpoint.com”)       。要( “码头:http://newendpoint.com”);