我们在嵌入式 jetty 服务器中部署了一个 spring-boot 应用程序,监听端口 X。现在我通过定义路由将 Apache Camel 集成到这个现有应用程序中。 目标是将少数休息端点移至将代理至其他服务的 Camel 路线。我无法理解以下内容
当我使用“jetty: http://localhost:Y/myapp”作为路由端点之一时。它工作正常,没有任何错误。这是否意味着 Camel 创建了自己的 jetty 实例?
当我使用“jetty: http://localhost:X/myapp”时,它再次工作,并且没有给出地址 X 正在使用的错误
我想保持对jetty服务器配置的控制,让camel监听已经存在的休息端点。
最佳答案
如果您可以配置一个 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 错误,该错误将被简单地转发到初始来电者)。
关于java - 在现有 Spring Boot 应用程序中使用 Camel 和 Jetty Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37089775/