在撰写本文时,我们刚刚向即将到来的Apache Camel 2.11添加了一个新组件,该组件允许使用Camel运行Web应用程序,而不必依赖Spring Framework来加速Camel。 或与此相关的任何其他第三方框架。
有点as愧地说,在2013年,我们要在Apache Camel中开箱即用提供此功能有点晚了。
在支持Servlet 3.0规范的现代Web容器中。 您可以使用新的@WebListener注释以编程方式引导代码。 但是即使如此,仍然需要完成工作,因为您将需要设置和配置Camel,并确保在停止Web应用程序时取消注册和停止资源。
我还没有找到一种使用@WebListener并允许对框架(例如Apache Camel)进行外部配置的巧妙方法。 我真的不想硬编码我的配置,也不必发明自己的加载外部配置和配置应用程序的方式。 有人知道解决此问题的方法吗?
无论如何,我们还想要一种适用于基于老式Servlet 2.x的容器的解决方案。 有很多人在那里奔跑。 即便如此,带有web.xml文件的旧式配置在较新的Servlet 3.0容器中也同样有效。 因此,我们需要一种适合两个世界的即用型解决方案。
展示的例子
我们在Apache Camel上有许多示例,其中一个是简单的Web应用程序,可以将其作为.war文件部署在Apache Tomcat或任何其他Web容器中。
这个示例使用Spring框架来增强Spring XML文件,其中嵌入了Camel。 因此,我们要做的是在不需要Spring的情况下重做此示例。
Apache Camel站点上记录了两个示例:
- http://camel.apache.org/servlet-tomcat-example.html
- http://camel.apache.org/servlet-tomcat-no-spring-example.html
CamelServletContextListener
在Camel 2.11中,我们有一个名为camel-servletlistener的新组件,它提供了一个新的CamelServletContextListener类,您可以在web.xml文件中对其进行配置。 然后,这将对CamelContext进行增强处理,并使用上下文初始化参数作为其配置。 该上下文侦听器具有大量配置,因此您可以轻松地根据需要配置Camel。 这些选项在Camel文档中列出:http://camel.apache.org/servletlistener-component.html。 并且如果您需要在Camel启动/停止时执行任何自定义逻辑,那么我们为此提供了一个API,即CamelContextLifecycle接口。 Camel文档中有更多详细信息和示例。
为了了解这一点,我建议阅读此博客后,查看新示例以及camel-servletlistener组件的文档。
剖析范例
有两个例子
- http://camel.apache.org/servlet-tomcat-example.html
- http://camel.apache.org/servlet-tomcat-no-spring-example.html
当部署到使用Java 1.6的Apache Tomcat 7.0.30的全新安装时,我们可以充分了解两者之间的差异。
servlet-tomcat-示例
大小:5.8 MB
罐子:19
所载课程:4507
当前堆大小:10 MB
servlet-tomcat-no-spring-example
大小:2.9 MB
罐子:10
所载课程:3698
当前堆大小:8 MB
我使用jconsole来查看JVM中带有Apache Tomcat和已部署示例的已加载类的数量。 堆大小被测量为执行GC后获得的最小值。 因此,我们从发行版中削减了10个JAR和3MB。 最好避免加载1000个类的代码。
备注
我只想强调一下,这个新的camel-servletlistener组件的目标是使人们能够轻松地在任何Web容器中引导其Camel应用程序,而无需绑定到任何特定的第三方框架(例如Spring)。 Apache Camel项目旨在保持中立和不可知论。 允许人们以任何方式和选择的容器来运行Camel。
参考: Camel 2.11 –我们的JCG合作伙伴 Claus Ibsen在Apache Camel博客的Claus Ibsen上没有Spring的Camel Web应用程序 。
翻译自: https://www.javacodegeeks.com/2013/01/camel-2-11-camel-web-applications-without-spring.html