301.9. ServletListener 组件
从 Camel 2.11 开始提供
此组件用于在 web 应用程序中引导 Camel 应用程序。例如,之前人员必须找到自己引导 Camel 的方式,或依赖 Spring 等第三方框架来实现它。
边栏 此组件支持 Servlet 2.x 以后,这意味着它也在较旧的 Web 容器中工作;这是此组件的目标。虽然 Servlet 2.x 需要使用 web.xml 文件作为配置。对于 Servlet 3.x 容器,您可以使用注释驱动的配置来利用 @WebListener 提升 Camel,并实施您自己的类,您可以在其中 boostrap Camel。这样做仍然给最终用户带来相应的挑战,从而使最终用户能够轻松配置 Camel,这可让您免费使用旧的 school web.xml 文件。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml
中:
301.9.1. 使用 复制链接链接已复制到粘贴板!
您需要选择抽象类 org.apache.camel.component.servletlistener.CamelServletContextListener
的一个实现。
-
JndiCamelServletContextListener
,它使用JndiRegistry
将 JNDI 用于其 registry。 -
SimpleCamelServletContextListener
,它使用SimpleRegistry
将java.util.Map
用作其 registry。
要使用此功能,您需要在 WEB-INF/web.xml
文件中配置 org.apache.camel.component.servletlistener.CamelServletContextListener
,如下所示:
301.9.2. 选项 复制链接链接已复制到粘贴板!
org.apache.camel.component.servletlistener.CamelServletContextListener
支持以下选项,可在 web.xml 文件中配置为 context-param。
选项 | 类型 | 描述 |
---|---|---|
propertyPlaceholder.XXX | 要在 Camel 中配置属性占位符。您应该为选项添加 "propertyPlaceholder.",例如配置位置,使用 propertyPlaceholder.location 作为 name。您可以配置 Properties 组件中的所有选项。 | |
jmx.XXX |
配置 JMX。您应该为选项添加 "jmx." 前缀,例如禁用 JMX,使用 jmx.disabled 作为名称。您可以配置 | |
name |
| 配置 CamelContext 的名称。 |
messageHistory |
| Camel 2.12.2: 是否启用或禁用消息历史(默认启用)。 |
streamCache |
| 是否启用流缓存。 |
trace |
| 是否启用 Tracer。 |
delayer |
| 为 Delay Interceptor 设置延迟值。 |
handleFault |
| 是否启用处理错误。 |
errorHandlerRef |
| 指的是要使用的上下文范围 Error Handler。 |
autoStartup |
| 启动 Camel 时是否启动所有路由。 |
useMDCLogging |
| 是否使用 MDC 日志记录。 |
useBreadcrumb |
| 是否使用面包屑导航栏. |
managementNamePattern |
| 要为 JMX MBeans 设置自定义命名模式。 |
threadNamePattern |
| 要为线程设置自定义命名模式。 |
properties.XXX |
要在 | |
routebuilder.XXX | 配置要使用的路由。详情请查看以下信息。 | |
CamelContextLifecycle |
指的是 | |
XXX | 要在 CamelContext 上设置任何选项。 |
301.9.3. 例子 复制链接链接已复制到粘贴板!
301.9.4. 访问创建的 CamelContext 复制链接链接已复制到粘贴板!
从 Camel 2.14/2.13.3/2.12.5 提供
创建的 CamelContext
作为键为 "CamelContext" 的属性存储在 ServletContext
上。如果您可以拥有 ServletContext
,您可以获得 CamelContext,如下所示:
ServletContext sc = ... CamelContext camel = (CamelContext) sc.getAttribute("CamelContext");
ServletContext sc = ...
CamelContext camel = (CamelContext) sc.getAttribute("CamelContext");
301.9.5. 配置路由 复制链接链接已复制到粘贴板!
您需要配置在 web.xml 文件中使用哪些路由。您可以通过多种方法执行此操作,但所有参数都必须以"routeBuilder"作为前缀。
301.9.5.1. 使用 RouteBuilder 类 复制链接链接已复制到粘贴板!
默认情况下,Camel 将假设 param-value 是 Camel RouteBuilder 类的 FQN 类,如下所示:
<context-param> <param-name>routeBuilder-MyRoute</param-name> <param-value>org.apache.camel.component.servletlistener.MyRoute</param-value> </context-param>
<context-param>
<param-name>routeBuilder-MyRoute</param-name>
<param-value>org.apache.camel.component.servletlistener.MyRoute</param-value>
</context-param>
您可以在相同的 param-value 中指定多个类,如下所示:
参数的名称在运行时没有意义。它只需要是唯一的,并以"routeBuilder"开头。在上例中,我们有 "routeBuilder-routes"。但是,您也可以将其命名为"routeBuilder.foo"。
301.9.5.2. 使用软件包扫描 复制链接链接已复制到粘贴板!
您还可以告知 Camel 使用软件包扫描,这意味着它将查看给定软件包中所有 RouteBuilder 类型类,并自动将它们添加为 Camel 路由。要做到这一点,您需要使用 "packagescan:" 为值添加前缀,如下所示:
<context-param> <param-name>routeBuilder-MyRoute</param-name> <!-- define the routes using package scanning by prefixing with packagescan: --> <param-value>packagescan:org.apache.camel.component.servletlistener.routes</param-value> </context-param>
<context-param>
<param-name>routeBuilder-MyRoute</param-name>
<!-- define the routes using package scanning by prefixing with packagescan: -->
<param-value>packagescan:org.apache.camel.component.servletlistener.routes</param-value>
</context-param>
301.9.5.3. 使用 XML 文件 复制链接链接已复制到粘贴板!
您还可以使用 XML DSL 定义 Camel 路由,但我们不使用 Spring 或 Blueprint XML 文件只能包含 Camel 路由。
在 web.xml 中,您可以引用来自 "classpath", "file" 或 "http" url 的 XML 文件,如下所示:
<context-param> <param-name>routeBuilder-MyRoute</param-name> <param-value>classpath:routes/myRoutes.xml</param-value> </context-param>
<context-param>
<param-name>routeBuilder-MyRoute</param-name>
<param-value>classpath:routes/myRoutes.xml</param-value>
</context-param>
XML 文件为:
routes/myRoutes.xml
请注意,在 XML 文件中,root 标签为 <routes>,它必须使用命名空间 "http://camel.apache.org/schema/spring"。此命名空间的名称中包含 spring,但由于历史原因,Spring 是第一个且唯一的 XML DSL。在运行时不需要 Spring JAR。在 Camel 3.0 中,命名空间可以重命名为通用名称。
301.9.5.4. 配置正确的占位符 复制链接链接已复制到粘贴板!
以下是用于设置属性占位符从 classpath 加载 myproperties.properties
的 web.xml 配置的片段
301.9.5.5. 配置 JMX 复制链接链接已复制到粘贴板!
以下是用于配置 JMX 的 web.xml 配置片段,如禁用 JMX。
JNDI 或 Simple as Camel Registry ^^^^^^^^^^^^^^^^^^^^
此组件使用 JNDI 或 Simple 作为 Registry。
这样,您可以在 JNDI 中查找 Bean和其他服务,也可绑定和取消绑定您自己的 Bean。
这通过实施 org.apache.camel.component.servletlistener.CamelContextLifecycle
从 Java 代码完成。
301.9.5.6. 使用自定义 CamelContextLifecycle 复制链接链接已复制到粘贴板!
在以下代码中,我们使用 Start
和 afterStop
在 Simple Registry 中对自定义 bean 进行回调,并在停止时进行清理。
然后,我们需要使用参数名称 "CamelContextLifecycle" 在 web.xml 文件中注册此类。该值必须是 FQN,它引用实施 org.apache.camel.component.servletlistener.CamelContextLifecycle
接口的类。
<context-param> <param-name>CamelContextLifecycle</param-name> <param-value>org.apache.camel.component.servletlistener.MyLifecycle</param-value> </context-param>
<context-param>
<param-name>CamelContextLifecycle</param-name>
<param-value>org.apache.camel.component.servletlistener.MyLifecycle</param-value>
</context-param>
我们使用名称"my Bean "来加入 HelloBean Bean,我们可以在 Camel 路由中引用此 Bean,如下所示:
重要: 如果您使用 org.apache.camel.component.servletlistener.JndiCamelServletContextListener
,则 CamelContextLifecycle
必须使用 JndiRegistry
。如果 servlet 是 org.apache.camel.component.servletlistener.SimpleCamelServletContextListener
,则 CamelContextLifecycle
必须使用 SimpleRegistry
301.9.6. 另请参阅 复制链接链接已复制到粘贴板!
- SERVLET
- Servlet Tomcat 示例
- Servlet Tomcat No Spring 示例