如何将Camel Java DSL实现的Servlet部署到Tomcat服务器?
问题说明
现有公开可查的适配Tomcat服务器的Camel Servlet示例多基于Spring DSL实现,现需要使用Java DSL编写指定逻辑的RouteBuilder。当前编写的代码通过mvn jetty:run命令启动Jetty服务器时可正常运行,但打包为WAR包部署到Tomcat服务器后无法正常工作。
核心实现代码
RouteBuilder代码
import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; public class DefaultRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { System.out.println("DefaultRouter"); from("servlet:hello?matchOnUriPrefix=true").process(new Processor() { public void process(Exchange exchange) throws Exception { String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class); String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class); path = path.substring(path.lastIndexOf("/")); exchange.getOut().setHeader(Exchange.CONTENT_TYPE, contentType + "; charset=UTF-8"); exchange.getOut().setHeader("PATH", path); exchange.getOut().setBody("<b>Hello World</b>"); } }); } }
web.xml配置
<?xml version="1.0" encoding="ISO-8859-1"?> <webapp> <display-name>camel-servlet</display-name> <context-param> <param-name>name</param-name> <param-value>MyCamel</param-value> </context-param> <context-param> <param-name>routeBuilder-MyRoute</param-name> <param-value>org.apache.camel.community.so.servletlistener.DefaultRouteBuilder</param-value> </context-param> <listener> <listener-class>org.apache.camel.component.servletlistener.JndiCamelServletContextListener</listener-class> </listener> <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>/camel/*</url-pattern> </servlet-mapping> </webapp>
运行日志记录
Jetty正常启动日志
执行mvn jetty:run启动服务的日志如下,可看到CamelContext正常启动、路由正常注册:
[INFO] Scanning elapsed time=1409ms [INFO] DefaultSessionIdManager workerName=node0 [INFO] No SessionScavenger set, using defaults [INFO] node0 Scavenging every 660000ms 2022-07-19 11:15:39,454 [main ] INFO CamelServletContextListener - CamelContextServletListener initializing ... DefaultRouter 2022-07-19 11:15:39,797 [main ] INFO ServletCamelContext - Apache Camel 2.25.0 (CamelContext: MyCamel) is starting 2022-07-19 11:15:39,804 [main ] INFO ManagedManagementStrategy - JMX is enabled 2022-07-19 11:15:40,094 [main ] INFO DefaultTypeConverter - Type converters loaded (core: 195, classpath: 9) 2022-07-19 11:15:40,233 [main ] INFO ServletCamelContext - StreamCaching is not in use. If using streams then its recommended to enable stream caching. 2022-07-19 11:15:40,272 [main ] INFO ServletCamelContext - Route: route1 started and consuming from: servlet:/hello?matchOnUriPrefix=true 2022-07-19 11:15:40,274 [main ] INFO ServletCamelContext - Total 1 routes, of which 1 are started 2022-07-19 11:15:40,276 [main ] INFO ServletCamelContext - Apache Camel 2.25.0 (CamelContext: MyCamel) started in 0.483 seconds 2022-07-19 11:15:40,277 [main ] INFO CamelServletContextListener - CamelContextServletListener initialized 2022-07-19 11:15:40,316 [main ] INFO CamelHttpTransportServlet - Initialized CamelHttpTransportServlet[name=CamelServlet, contextPath=/camel-example-servlet] [INFO] Started o.e.j.m.p.JettyWebAppContext@2764c546{Camel Servlet Example,/camel-example-servlet,file:///C:/Users/rrdoshi/Downloads/camel-example-servlet/src/main/webapp/,AVAILABLE}{file:///C:/Users/rrdoshi/Downloads/camel-example-servlet/src/main/webapp/} [INFO] Started ServerConnector@2b73bd6b{HTTP/1.1,[http/1.1]}{0.0.0.0:8080} [INFO] Started @8097ms [INFO] Started Jetty Server
注:已移除日志中包含的外部跳转链接
Tomcat部署启动日志
将WAR包放入Tomcat的webapps目录后执行startup.bat启动,启动日志如下,无Camel相关启动记录:
19-Jul-2022 11:21:21.403 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 19-Jul-2022 11:21:21.576 WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [146] milliseconds. 19-Jul-2022 11:21:21.596 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\ApacheCamelDemoServlet] 19-Jul-2022 11:21:21.645 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\ApacheCamelDemoServlet] has finished in [49] ms 19-Jul-2022 11:21:21.646 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\docs] 19-Jul-2022 11:21:21.671 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\docs] has finished in [25] ms 19-Jul-2022 11:21:21.672 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\examples] 19-Jul-2022 11:21:22.097 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\examples] has finished in [425] ms 19-Jul-2022 11:21:22.099 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\host-manager] 19-Jul-2022 11:21:22.135 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\host-manager] has finished in [36] ms 19-Jul-2022 11:21:22.136 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\manager] 19-Jul-2022 11:21:22.175 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\manager] has finished in [38] ms 19-Jul-2022 11:21:22.175 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\ROOT] 19-Jul-2022 11:21:22.202 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Users\rrdoshi\Downloads\apache-tomcat-9.0.64-windows-x64\apache-tomcat-9.0.64\webapps\ROOT] has finished in [26] ms 19-Jul-2022 11:21:22.205 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8088"] 19-Jul-2022 11:21:22.224 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [2721] milliseconds
Tomcat访问日志
服务启动后访问对应路径,日志如下,目标路由返回404:
127.0.0.1 - - [19/Jul/2022:11:23:51 +0530] "GET /camel-servlet/ HTTP/1.1" 200 1675 127.0.0.1 - - [19/Jul/2022:11:24:01 +0530] "GET /camel-servlet/camel/hello HTTP/1.1" 404 784
Tomcat localhost日志
19-Jul-2022 11:21:22.085 INFO [main] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized() 19-Jul-2022 11:21:22.085 INFO [main] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized() 19-Jul-2022 11:21:22.087 INFO [main] org.apache.catalina.core.ApplicationContext.log ContextListener: attributeAdded('StockTicker', 'async.Stockticker@68ab0936')
异常现象汇总
- WAR包可正常完成Tomcat部署流程,启动全程无错误日志输出
- 启动日志中不存在任何CamelContext初始化、启动的相关记录,代码中打印
DefaultRouter的逻辑也未执行 - 访问配置的路由地址
/camel/hello时返回404状态码
内容的提问来源于stack exchange,提问作者Riddhi Doshi
相关产品推荐
相关产品推荐

