318.2. 添加 Camel 架构
对于 Camel 1.x,您需要使用以下命名空间:
http://activemq.apache.org/camel/schema/spring
使用以下模式位置:
http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
您需要将 Camel 添加到 schemaLocation
声明中
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
因此 XML 文件类似如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
318.2.1. 使用 camel: namespace
或者您可以在 XML 声明中引用 camel XSD :
xmlns:camel="http://camel.apache.org/schema/spring"
- 因此,声明是:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
- 然后,使用 camel: namespace 前缀,您可以省略内联命名空间声明:
<camel:camelContext id="camel5"> <camel:package>org.apache.camel.spring.example</camel:package> </camel:camelContext>
318.2.2. 使用 Spring 进行高级配置
请参阅 使用 Spring 的 CamelContext 高级配置中更多详情
$# using Java Code
您可以使用 Java Code 定义 RouteBuilder 实现。它们可以在 spring 中定义 Bean,然后在您的 camel 上下文中引用,例如:
318.2.3. 使用 <package>
Camel 还提供了强大的功能,允许在给定软件包中自动发现和初始化路由。这通过将标签添加到 spring 上下文定义中的 camel 上下文,指定要递归搜索 RouteBuilder 实施的软件包。要在 1.X 中使用此功能,需要一个 <package></package> 标签,指定应搜索的以逗号分隔的软件包列表,例如:
<camelContext xmlns="http://camel.apache.org/schema/spring"> <package>org.apache.camel.spring.config.scan.route</package> </camelContext>
WARNING: 在将软件包名称指定为 org.apache.camel
或其子软件包时要小心。这会导致 Camel 在自己的软件包中搜索可能会导致问题的路由。
INFO:* will ignore already instantiated classes*.<package> 和 <packageScan> 将跳过由 Spring 等创建的任何类。因此,如果您将路由构建器定义为 spring bean 标签,则会跳过该类。您可以使用 < routeBuilder ref="theBeanId"/> 或 <
contextScan> 功能包含这些
Bean。
318.2.4. 使用 <packageScan>
在 Camel 2.0 中,这已扩展为允许使用 Ant (如路径匹配)选择和排除发现的路由类。在 spring 中,这通过添加 <packageScan/> 标签来指定。该标签必须包含一个或多个 'package' 元素(类似于 1.x),可选一个或多个 'includes' 或 'excludes' 元素指定要应用到发现类的完全限定域名的模式。
<camelContext xmlns="http://camel.apache.org/schema/spring"> <packageScan> <package>org.example.routes</package> <excludes>**.*Excluded*</excludes> <includes>**.*</includes> </packageScan> </camelContext>
在 include 模式之前应用排除模式。如果没有定义 include 或 exclude 模式,则返回软件包中发现的所有 Route 类。
在上例中,camel 将扫描所有 'org.example.routes' 软件包以及 RouteBuilder 类的任何子软件包。表明扫描找到两个 RouteBuilders,一个用于 org.example.routes 中,一个名为 'MyRoute",另一个名为 'MyExcludedRoute'(子软件包 'excluded')。每个类的完全限定名称都会被提取(org.example.routes.MyRoute, org.example.routes.excluded.MyExcluded.MyExcludedRoute),并应用 include 和 exclude 模式。
排除模式是,为为 fqcn 'org.example.routes.excluded.MyExcludedRoute' 和 veto camel 匹配,from 初始化它。
在覆盖范围内,这使用 Spring 的 AntPatternMatcher 实现,它匹配,如下所示
? matches one character * matches zero or more characters ** matches zero or more segments of a fully qualified name
例如:
* unsetexcluded 将与 org.simple.Excluded, org.apache.camel.SomeExcludedRoute 或 org.example.RouteWhichIsExcluded 匹配
dc?cluded 将与 org.simple.IncludedRoute 匹配 org.simple.IncludedRoute,但不匹配 org.simple.PrecludedRoute
318.2.5. 使用 contextScan
从 Camel 2.4 开始提供
您可以允许 Camel 扫描容器上下文,例如,用于路由构建器实例的 Spring ApplicationContext
。这可让您使用 Spring < component-scan>
; 功能,并让 Camel 选择其扫描过程中由 Spring 创建的任何 RouteBuilder 实例。
这可让您使用 Spring @Component
注解路由,并包含这些路由。
@Component public class MyRoute extends SpringRouteBuilder { @Override public void configure() throws Exception { from("direct:start").to("mock:result"); } }
您还可以使用 ANT 风格来包含和排除,如 < packageScan>
; 文档中所述。