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