第 4 章 在 Spring XML 中使用 Camel
Spring XML
将 Camel 与 Spring XML 文件一起使用,是一种在 Camel 中使用 XML DSL 的方法。Camel 过去使用 Spring XML 长时间。Spring 框架以 XML 文件开始,作为构建 Spring 应用程序的常见配置。
Spring 应用程序示例
<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 "> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:a"/> <choice> <when> <xpath>$foo = 'bar'</xpath> <to uri="direct:b"/> </when> <when> <xpath>$foo = 'cheese'</xpath> <to uri="direct:c"/> </when> <otherwise> <to uri="direct:d"/> </otherwise> </choice> </route> </camelContext> </beans> == Specifying Camel routes using Spring XML You can use Spring XML files to specify Camel routes using XML DSL as shown: [source,xml]
<CamelContext id="camel-A" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="seda:start"/> <to uri="mock:result"/> </route> </camelContext>
== Configuring Components and Endpoints You can configure your Component or Endpoint instances in your Spring XML as follows in this example. [source,xml]
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> </camelContext>
<bean id="jmsConnectionFactory" class="org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp:someserver:61616"/> </bean> <bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory"> <bean class="org.apache.activemq.artemis.jms.client.ActiveMQCFactory"> <property name="brokerURL" value="tcp:someserver:61616"/> </bean> </property> </bean>
This allows you to configure a component using any name, but its common to use the same name, for example, `jms`. Then you can refer to the component using `jms:destinationName`. This works by the Camel fetching components from the Spring context for the scheme name you use for Endpoint URIs. == Using Java DSL with Spring XML files You can use Java Code to define your RouteBuilder implementations. These are defined as beans in spring and then referenced in your camel context, as shown: [source,xml]
<CamelContext xmlns="http://camel.apache.org/schema/spring"> <routeBuilder ref="myBuilder"/> </camelContext>
<bean id="myBuilder" class="org.apache.camel.spring.example.test1.MyRouteBuilder"/>
== Using package scanning Camel also provides a powerful feature that allows for the automatic discovery and initialization of routes in given packages. This is configured by adding tags to the camel context in your spring context definition, specifying the packages to be recursively searched for `RouteBuilder` implementations. To use this feature add a <package></package> tag specifying a comma separated list of packages that should be searched. For example, [source,xml]
<CamelContext> <packageScan> <package>com.foo</package& <excludes> gt; .Excluded</excludes> <includes& gt; 114</includes> </packageScan> </camelContext>
This scans for RouteBuilder classes in the `com.foo` and the sub-packages. You can also filter the classes with includes or excludes such as: [source,xml]
<CamelContext> <packageScan> <package>com.foo</package <excludes> ></excludes> the </packageScan> </camelContext>
This skips the classes that has Special in the name. Exclude patterns are applied before the include patterns. If no include or exclude patterns are defined then all the Route classes discovered in the packages are returned. `?` matches one character, `\*` matches zero or more characters, `**` matches zero or more segments of a fully qualified name. == Using context scanning You can allow Camel to scan the container context, for example, the Spring `ApplicationContext` for route builder instances. This allows you to use the Spring `<component-scan>` feature and have Camel pickup any RouteBuilder instances which was created by Spring in its scan process. [source,xml]
<!-- 启用 Spring @Component scan -→ <context:component-scan base-package="org.apache.camel.spring.issues.contextscan"/>
<CamelContext xmlns="http://camel.apache.org/schema/spring"> <!--,然后让 Camel 使用这些 @Component Scan route builders -→ <contextScan/> </camelContext>
This allows you to just annotate your routes using the Spring `@Component` and have those routes included by Camel: [source,java]
@component public class MyRoute 扩展 RouteBuilder {
@Override public void configure() throws Exception { from("direct:start") .to("mock:result"); } }
You can also use the ANT style for inclusion and exclusion, as mentioned above in the package scan section. :leveloffset!: