Apache Camel之Spring集成

之前使用Apache Camel作爲核心框架做過幾個項目,但時隔幾個月再將其集成到一個新項目中時,突然有種無從下手的感覺。

1. 概述

作爲一個擁有着極其活躍社區的組件, Apache Camel對於Spring支持可謂是極盡所能。強大社區的優勢,對於從.NET陣營轉到Java的筆者而言,五味雜陳。

2. Spring 集成

相較於SpringBoot的集成,單獨的Spring集成會稍微多幾個步驟,但也是非常方便快捷的。

  1. 推薦使用單獨的spring-config-camel.xml配置文件,並使用<import>引入到主spring-config.xml中。

    <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">
         <amel:camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
         	<!--多個package可以使用 , 進行分割 -->
         	<!--配置的路徑最終在 AbstractCamelContextFactoryBean.findRouteBuilders()中用來查找RouteBuilder, 因此是不會對Spring形成干擾的-->
            <camel:package>com.xxx.yyy.zzz</camel:package>
        </amel:camelContext>
    </beans>
    
  2. 以上XML配置,按照我們之前對於Spring源碼的理解,可以發現其解析入口爲org.apache.camel.spring.handler.CamelNamespaceHandler類。而針對於<amel:camelContext>的解析則是委託給內部類CamelNamespaceHandler.CamelContextBeanDefinitionParser來完成的。

  3. <amel:camelContext> 對應於類 CamelContextFactoryBean(可以在本類上看到Camel使用JAXB來映射兩者的關係)。而第2步中提到的內部類CamelNamespaceHandler.CamelContextBeanDefinitionParser正是以CamelContextFactoryBean作爲構造函數參數的。

3. SpringBoot 集成

依託於SpringBoot強大的COC(Convention over Configuration)特性,Camel社區也是提供了相應的starter組件,使得集成變得如絲般潤滑。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
    <!--apache camel的另外一大貼心的地方就是, 一旦版本升級, 那麼其他相關的組件等的版本號也都會一併升級-->
    <!-- use the same version as your Camel core version -->
    <version>${camel.version}</version> 
</dependency>

只需要在pom.xml文件中引入以上依賴,基礎的配置工作就自動完成了,關於其中的原理可以參見筆者之前的一篇博文SpringBoot源碼解析之AutoConfiguration

基礎配置完成之後,我們還需要自定義的路由規則來完成業務邏輯。方式如下:

@Component
public class CustomRouter extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    from("file:/me")//
    .to("file:/invoices");
  }
}

只需要以上兩步,你就可以開始愉快地享受Apache Camel給你的應用帶來的便捷性和穩固性。更多細節參加下方引用的官方文檔。

4. Links

  1. 《Apache Camel Developer’s Cookbook》 P21
  2. Apache Camel集成SpringBoot
  3. Apache Camel集成Spring
  4. Apache Camel archetypes生成Spring項目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章