我正在使用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?
好吧,我终于找到了问题所在。
我怀疑我总是使用。组件(“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 日志: