当前位置: 首页 > 知识库问答 >
问题:

在现有的带有Jetty服务器的Spring Boot应用程序中使用Camel

东郭兴学
2023-03-14

我们在embedded jetty server中部署了一个spring-boot应用程序,监听端口X。现在,我正在通过定义路由将Apache Camel集成到这个现有的应用程序中。目标是将少数restendpoint移动到将被代理到其他服务的骆驼路由。我无法理解以下内容

>

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

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

    我希望保持对jetty服务器配置的控制,并让camel监听已经存在的restendpoint。

  • 共有1个答案

    陶琦
    2023-03-14

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

    官方文件中的相关页面在这里。对您来说,有趣的例子是使用servlet组件的例子,因为您已经配置并运行了一个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是基于Apache HttpClient4.x的HTTP4组件。(如果需要,您仍然可以使用基于HTTPClient 3.x的HTTP组件)。
    • 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错误,该错误将简单地转发给初始调用者)。

     类似资料:
    • 我使用ESAPI jar进行验证。当我调用isValidInput(Context,input.trim(),ValidateConstant时。APLHA_NUMERIC_TYPE,最大长度,真);或isValidInput(上下文,输入,ValidateConstant.NUMERIC_TYPE,maxLength,true);并且输入错误,带有单独的字符。然后它抛出一些像 当我单独执行程序时

    • 我来自一个角度分明的世界,在那里我可以将逻辑提取到服务/工厂,并在控制器中使用它们。 我试图了解如何在React应用程序中实现相同的功能。 假设我有一个验证用户密码输入的组件(它的强度)。它的逻辑相当复杂,因此我不想将其写在组件中。 我应该在哪里写这个逻辑?在商店里,如果我使用flux?还是有更好的选择?

    • 请注意,该错误只发生在带有Jetty 9.4.21的Spring Boot应用程序中,在Jetty 9.4.20中,相同的Spring Boot应用程序可以正常工作。 如有任何帮助,我们将不胜感激。

    • 问题内容: 我来自一个有角的世界,在那里我可以将逻辑提取到服务/工厂,并在控制器中使用它们。 我试图了解如何在React应用程序中实现相同的目标。 假设我有一个可以验证用户密码输入(强度)的组件。它的逻辑非常复杂,因此我不想将其编写在自己的组件中。 我应该在哪里写这个逻辑?在商店中,如果我使用助焊剂?还是有更好的选择? 问题答案: 第一个答案并不反映当前的Container vs Presente

    • 问题内容: 我正在尝试编写AngularJS客户端专用应用程序。 我以为我也许可以通过在地址栏中输入以下内容从chrome加载它:file:/// C:/path/to/project//index.html我也尝试过用 –allow-file标志调用chrome从文件访问 不幸的是,什么都没有发生-只是选项卡名称上的繁忙标志正在起作用。 为什么不加载我的应用程序? 我正在使用以下代码: inde