Apache Camel简化SOA实施进程
http://yangzb.iteye.com/blog/494571
Apache Camel簡化SOA實施進程
- 博客分類:
- Framework
在過去的幾年中,整合技術得到了突飛猛進的發展。XML /REST /Web 服務/面向服務架構(SOA)的革命不斷的促使工程師們和軟件公司去創造豐富的協議、適配器、傳輸器、容器、標準,最佳實踐···應有盡有。
無可否認的,現有的這些代碼是非常復雜的、多樣化的,幾乎沒有什么它們不可以做到的事情。但這些軟件包都是從技術上來建立的,從而使得如何有效的使用其功能成為了讀者很大的挑戰。
目前,眾多讀者都完成了這一項挑戰。豐富的經驗和成千上萬的成功案例促進了許多基礎架構設計模式定義的形成,從而幫助開發者在整合時能夠開門見山,少走彎路。其中,有一套設計模式在業界引起了注意,那就是Hohpe 和 Woolf's企業整合模式。這些模式包含了一些技術上無關的詞匯來描述大量整合的解決方案。他們并不是側重于低層次的編程,而是采取自上而下的方案來開發一個異步的、以信息為基礎的架構。
一致的詞匯是很好的,而易于使用的框架在實際建立基礎架構的時候豈不是更好嗎?
這正是Apache 的開源Camel項目背后的理念?,F在,行之有效的并且真實的一套模式已可以獲得了,很明顯,下一步就是要去創造一個能夠以最簡單的方式來實施這個模式的驅動器。
Camel 是一個代碼先行的工具,它允許開發者在無須學習廠商定制和復雜的底層技術的情況下進行精密的大規模集成。Camel使用Java 領域說明性專用語言來連接信息系統和配置路由和調解規則,在POJO基礎上實施企業整合模式。這樣,就能使得開發人員不必閱讀一頁又一頁的諸如JMS 或JBI之類的技術規范,也不用處理較低級別的Spring框架就可以直接設計和建立面向服務架構(SOA)。
Apache Camel是從Apache其他項目尤其是Apache ActiveMQ 以及Apache ServiceMix的代碼和靈感有機的衍生出來的。該項目的成員們發現:人們在許多不同的情況下都想要建立或是使用企業集成模式書中的模式。因此,Camel團隊就這樣明確的目的開始建立這樣的框架。
Camel 概況:
建立Camel的第一步是解偶底層框架中的模式。一些人想要利用企業服務總線(ESB )中的模式,還有一些人則選擇Message Broker中的模式,而其他人需要使用應用程序自身的模式或信息提供者間進行對話。仍然有一些人想要在Web服務 框架下或是其他溝通平臺上使用。比起將此路由代碼與特定的Message Broker或企業服務總線(ESB)綁定來說,Camel選擇提取此代碼作為獨立的框架, 這樣一來它就能被應用到任何的項目中去。Camel有一個腳本――不管是在Servlet , 或是Web服務包中,全面企業服務總線(ESB),還是信息應用程序中,任何地方都可以做到重新利用。
Camel的最初也是主要的優勢在于開發團隊無須為了連接系統在容器上下功夫。很多人會認為從容器上下功夫是一個正確的途徑,甚至是當成對勇氣的考驗,但對于越來越多的團隊來說這些阻礙成為了不必要的障礙。有了Apache Camel,開發人員就能在完成任務的過程中將無關的任務減少到最低。如果其他要求得到保證的話,Camel還可以在JBI容器中實施,但這并不是必要的。
為了簡化編程,Camel還支持特定的Java和XML域語言,使得企業集成模式你那個在所有的Java IDE 或Spring XML中使用。這種更高層次的提取能更有效的解決問題。
Camel重新利用了許多Spring 2 的特性,如說明性交易,控制配置倒置,以及眾多為了與JMS和JDBC,Java Persistence API (JPA)結合工作的實用層面的東西。這提高了抽取的水平,簡化了編程,減少了需要編寫的XML,但如果人們要是追根究底花些功夫的話,也會發現其實 Camel仍然暴露了線級訪問。
Camel示例
我們分別解釋不同的方式實現Apache Camel的配置,首先將使用Java DSL(領域特定語言),接下來是Spring XML配置。
Java DSL 配置
如下的列子就是實現了當你想在一個目錄結構中從JMS對列里得到信息。首先,我們需要創建一個CamelContext對象:
CamelContext context = new DefaultCamelContext();
這里遠不止一種方法向CamelContext添加組件。你也可以在我們創建好路由之后再添加組件,正如一下示例所示:
?
| context.addRoutes(new?RouteBuilder()?{ public?void?configure()?{ from("test-jms:queue:test.queue").to("file://test"); //?set ?up?a?listener?on?the?file?component from("file://test").process(new?Processor()?{ public?void?process(Exchange ?e)?{ System.out.println("Received?exchange:?"?+?e.getIn()); } }); } }); |
或者明確的加入JMS組件,如下所示:
| ConnectionFactory?connectionFactory?=?new?ActiveMQConnectionFactory("vm://localhost?broker.persistent=false"); //?note?we?can?explicity?name?the?component context.addComponent("test-jms",?JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); |
下次你必須要啟動Camel context。如果你使用Spring去配置Camel context這將會為你實現自動化過程,如果你是使用純Java的話那就必須用先調用start()的方法:
camelContext.start();
這將啟動所有的配置路由規則。
當我們完全啟動CamelContext后我們可以輸入一些對象至Camel。
在通常的使用中,更多的情況往往是通過一些功能組件,外部系統將一些信息或是事件直接輸入到Camel中,但是在這里我們將使用CamelTemplate,這也是一個最簡單的方法用以測試之前的配置是否正確。
CamelTemplate template = new CamelTemplate(context);
這時我們可以使用CamelTemplate通過JMS發送一些測試消息:
| for?(int?i?=?0;?i?<?10;?i++)?{ template.sendBody("test-jms:queue:test.queue",?"Test?Message:?"?+?i); } |
我們從CamelTemplate中發送對象(此時通常為文本對象)納入CamelContext中并提供給測試組件:jms:queue:test.queue。這些文本對象會自動修改進JMS信息中,并在JMS對列中以test.queue張貼出來。當我們創建好路線我們配置好FileComponent去接收test.queue。
FileComponent文件將從對列中提取信息并保存在一個名為test的目錄中。每一條信息都會存放在一個與其目的地或是信息ID相對應的文件中。
最后,我們配置自己的listener并從FileComponent獲得通知,以文本的形式打印出來。
Spring XML配置
這個示例將使用Spring XML配置實現文件的轉換,利用XQuery從目錄中將結果發送至JMS 對列。它從目錄中選取文件進行解析,然后使用XQuery進行轉換,再發送至消息對列。當然,為了更清楚的看到生成文件,我們也會有一些別的方法去從 JMS對列中選取內容再寫到一個輸出目錄中。
運行示例
讓我們用Camel Maven插件來運行這段示例。舉例來說,通過開源軟件的源代碼版或可執行版即可實現以下操作:
| cd?examples/camel-example-spring-xquery mvn?camel:run |
你現在應該可以看到在target/outputFiles目錄下所生成的文件內容,這就是從JMS對列中所讀出的轉化信息。
代碼走查
需要做的是用那些定義在類下的 META-INF/spring/camelContext.xml文件正常啟動Spring應用。這是應用Camel的XML配置進行配置CamelContext的規范Spring XML文檔。
請務必注意這段XML示例文件底部,我們明確的配置了ActiveMQ組件以及關于如何連接代理的詳細內容。
關鍵的Spring XML代碼內容如下所示:
?
| <camelContext?useJmx="true"?xmlns="http://activemq.apache.org/camel/schema/spring"> ???<!--?lets?parse?files,?transform?them?with?XQuery?and?send?them?to?JMS?--> ???<route> ?????<from?uri="file:src/data?noop=true"/> ?????<to?uri="xquery:myTransform.xquery"/> ?????<to?uri="jms:MyQueue"/> ???</route> ???<!--?now?lets?write?messages?from?the?queue?to?a?directory?--> ???<route> ?????<from?uri="jms:MyQueue"/> ?????<to?uri="file:target/outputFiles"/> ???</route> </camelContext> <!--?lets?configure?the?default?ActiveMQ?broker?URL?--> <bean?id="jms"?class="org.apache.camel.component.jms.JmsComponent"> ???<property?name="connectionFactory"> ?????<bean?class="org.apache.activemq.ActiveMQConnectionFactory"> ???????<property?name="brokerURL"?value="vm://localhost?broker.persistent=false"/> ?????</bean> ???</property> </bean>? |
希望這篇文章能夠讓你真正認識到使用Apache Camel來實現企業應用整合是一件多么實際的事。
?
總結
以上是生活随笔為你收集整理的Apache Camel简化SOA实施进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring中自定义属性编辑器Custo
- 下一篇: Xquery 被设计用来查询 XML 数