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

在骆驼中使用RestServlet与Guice和Undertow

商泽宇
2023-03-14

我正在使用Undertow进行设置和应用程序,我已经为静态文件设置了ResourceHandler,以及apache camel用来公开rest服务的Servlet。

我已经在应用程序容器中使用spring和servlet3.0实现了这一点。

在扩展组织的类中。springframework。网状物servlet。支持AbstractAnnotationConfigDispatcherServletInitializer

@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
    super.onStartup(servletContext);
    ServletRegistration.Dynamic servlet = servletContext.addServlet("RestServlet", new CamelHttpTransportServlet());
    servlet.setLoadOnStartup(1);
    servlet.addMapping("/rest/*");
}

还有骆驼路线

restConfiguration()
            .component("RestServlet")
            .bindingMode(RestBindingMode.json)
            .dataFormatProperty("prettyPrint", "true");

非常接近http://camel.apache.org/servlet.html中描述的

但如果我作为一个嵌入式系统在底层做这件事,我就会得到组织。阿帕奇。骆驼NoSuchBeanException:在注册表中找不到类型为:org的:RestServlet的bean。阿帕奇。骆驼spi。RestConsumerFactory,我想Guice从来没有找到Undertow创建的servlet。我试图手动将CamelHttpTransportServlet作为GUI绑定公开,但这似乎没有改变什么。

ClassLoader classLoader = getClass().getClassLoader();
    ResourceHandler staticHandler = new ResourceHandler(new ClassPathResourceManager(classLoader, STATIC_RESOURCE_ROOT))
            .addWelcomeFiles(INDEX_HTML);

    DeploymentInfo deploymentInfo = Servlets.deployment()
            .setClassLoader(classLoader)
            .setContextPath(ROOT_MAPPING)
            .setDeploymentName(DEPLOYMENT_NAME)
            .addServlet(
                    Servlets.servlet("RestServlet", CamelHttpTransportServlet.class)
                            .addMapping(REST_MAPPING)
                            .setLoadOnStartup(1)
            );

    DeploymentManager manager = Servlets.defaultContainer().addDeployment(deploymentInfo);
    manager.deploy();

    PathHandler path = Handlers.path()
            .addPrefixPath(REST_MAPPING, manager.start())
            .addPrefixPath(ROOT_MAPPING, staticHandler);

    undertow = Undertow.builder()
            .addHttpListener(port, LOCALHOST)
            .setHandler(path)
            .build();
    undertow.start();

静态资源按预期工作,rest servlet似乎正在运行并获得响应,但CamelContext不会启动。

我不能在camel中使用restlet或任何东西,因为这样端口将被使用,所以我需要为静态文件和rest使用不同的端口。有没有办法让camel识别由牵引下启动的Servlet?

共有1个答案

顾超
2023-03-14

好吧,我终于找到了问题所在。

我怀疑我总是使用。组件(“servlet”)而不是。组件(“RestServlet”),但之前Camel不会自动链接此组件。

我将此部分更改为

restConfiguration()
            .bindingMode(RestBindingMode.json)
            .component("servlet")
            .dataFormatProperty("prettyPrint", "true")
            .endpointProperty("servletName", "RestServlet);

部署时,我将servlet映射更改为/*请求。getPathInfo()将在CamelHttpTransportServlet内部返回null。注意,我遇到了一个问题,因为我最初将contextPath设置为rest,这会打乱会话和cookie

DeploymentInfo deploymentInfo = Servlets.deployment()
            .setClassLoader(classLoader)
            .setContextPath("/rest/")
            .setDeploymentName(DEPLOYMENT_NAME)
            .addServlet(
                    Servlets.servlet("RestServlet", CamelHttpTransportServlet.class)
                            .addMapping("/*")
                            .setLoadOnStartup(1)
            );
 类似资料:
  • 我正在骆驼中开发一种机制,它将从一个可以是真或假的标志中为消息选择一个endpoint。这是一种节流机制,在我的上游通道被洪水淹没的情况下,它将把消息重新路由到批量摄取endpoint(发送到HDFS)。 最终,我的路线是这样的: 我的ThrottleHelper类的buildEndpoint方法如下所示: 目前,我在类上有一个名为checkStatus()的方法;设置shouldThrottle

  • 我的骆驼路线如下。我正在使用SMPPSim作为模拟器... 我面临以下问题..... exchangeId的传递失败:传递尝试后耗尽:捕获到6:org.jsmpp.extra.NegativeResponseException:找到否定响应0000000 b。由故障处理器处理:FatalFallbackErrorHandler[Channel[sendTo(Endpoint[jms://queue

  • 问题内容: 我一直在仔细研究Apache Camel文档,试图对它的两个 最基本 概念(端点和路由)有一个具体的了解,尽管这些术语在文档中各处都使用,但是我找不到真正定义它们的参考。是以及它们的用途。尽管它们的名称听起来很明显,而且我 想 我理解它们的含义,但是现在我已被分配到一项使我深深陷入Apache Camel Land的任务,而了解这些机制的绝对至关重要是。 我的猜测是,“端点”只是一个b

  • 我想在我的 Camel 2.23.2 路由上实现一些内容缓存。在研究过程中,我遇到了骆驼的JCache组件,根据文档,它应该有一个JCache政策,它将: JCachePolicy是路由周围的拦截器,它在路由完成后缓存“路由结果”(消息正文)。如果下次使用“类似”Exchange调用路由,则在Exchange上使用缓存的值,而不是执行路由 这基本上正是我正在寻找的。然而,事实证明,该策略仅适用于C

  • 我正在使用带有Apache骆驼的Spring Boot。我正在从控制器调用路由。一旦路由完成,控制就会返回控制器。我正在VerifyLimitProcess和批准限制处理器中生成响应。如果我没有在路由中提供窃听配置,控制器会按预期检索标头和正文。但如果我在路由中引入窃听,控制器会将标头和正文接收为null。如果有人指出我需要做什么,以便我可以在选择语句中引入两个处理器的窃听配置,即VerifyLi

  • 我有一条小路线,我想使用自定义的重新传递策略来重复向endpoint发送消息,但这种行为非常奇怪。看起来,重新交付政策只是在重复一个错误。我试图将所有交换发送到路由的开头,但策略不起作用,因为每次都在创建: 我做错了什么?当错误发生时,我想以间隔重复我的请求。我的骆驼版本是2.6 日志: