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,而您可通过旧的 ium web.xml 文件自由配置 Camel。
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 作为名称。您可以配置 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 中,您引用 XML 文件,该文件可以是 "classpath", "file" 或 "http" url,如下所示:
<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. 配置正确的占位符 复制链接链接已复制到粘贴板!
以下是 web.xml 配置的一个片段,用于将属性占位符设置为从 classpath 加载 myproperties.properties
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 的回调,将自定义 bean 列在 Simple Registry 中,并在我们停止时进行清理。
然后,我们需要使用参数名称"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 Example