我们在嵌入式Jetty服务器中部署了一个spring-boot应用程序,侦听端口X.现在我通过定义路由将Apache Camel集成到现有应用程序中。 目标是将少数休息终点移至将代理到其他服务的骆驼路线。我无法理解以下
当我使用“jetty:http://localhost:Y/myapp”作为路由端点之一时。它没有任何错误。这是否意味着Camel创建了自己的jetty实例?
当我使用“jetty:http://localhost:X/myapp”时 - 它再次起作用而没有给出地址X正在使用的错误
我想保持对jetty服务器配置的控制,让骆驼听听现有的休息终点。
答案 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");
http4
是HTTP4 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”);