Apache Camel是一個基於Enterprise Integration Pattern(企業整合模式,簡稱EIP)的開源框架。EIP定義了一些不同應用系統之間的消息傳輸模型,包括常見的Point-to-Point,Pub/Sub模型。更多關於EIP的信息,可以參見
這里
Apache Camel主要提供了以下功能:
1,實現了EIP的大部分模式,如果你要在不同的應用系統之間以不同的方式傳遞消息,那么你可以從Apache Camel中找到解決反感。
2,提供了大量Component(組件),每個組件都是一種消息中間件(或消息服務)的具體實現,每個消息中間件所用的協議都是不同的,因此,你可以通過多種不同的協議來完成消息傳輸。
3,允許用戶定義靈活的路由規則,從這個角度來說,Apache Camel時一個規則引擎。
那么Apache Camel的應用場景有那些呢,這里列舉一些:
1,消息匯聚,比如你有來自不同服務器的消息,有ActiveMQ,RabbitMQ,WebService等,你想把它們都存儲到日志文件中,那么可以定義如下規則。
1 new RouteBuilder() { 2 @Override 3 public void configure() throws Exception { 4 from("amqp:queue:incoming").to("log:com.mycompany.log?level=DEBUG"); 5 from("rabbitmq://localhost/A/routingKey=B").to("log:com.mycompany.log?level=DEBUG"); 6 from("jetty:http://localhost:8080/myapp/myservice").to("log:com.mycompany.log?level=DEBUG"); 7 } 8 }
from表示從這個endpoing取消息,to表示將消息發往這個endpoint,endpoint是消息地址,包含協議類型以及url。
2,消息分發,分為兩種,順序分發和並行分發。順序分發時,消息會先到到第一個endpoing,第一個endpoint處理完成后,再分發到下下個endpoint。如果第一個endpoing處理出現故障,那么消息不會被傳到第二個endpoint。比如有如下規則:
from("amqp:queue:order").to("uri:validateBean", "uri:handleBean", "uri:emailBean");
這個規則是從order隊列中取訂單信息,然后依次驗證訂單,處理訂單,並發送郵件通知用戶。任何一個步驟出錯,下一個步驟將不回執行。
並行分發是將得到的消息同時發送到不同的endpoint,沒有先后順序之分,各個endpoint處理消息也是獨立的。如果將以上路由改成
from("amqp:queue:order").multicast().to("uri:validateBean", "uri:handleBean", "uri:emailBean");
那么消息就會同時發到to所對應的endpoint。
3,消息轉換,比如想將xml數據轉換成json數據,可以使用如下規則。
from("amqp:queue:order").process(new XmlToJsonProcessor()).to("bean:orderHandler");
其中XmlToJsonProcessor是自定義的類,繼承org.apache.camel.Processor,用於將xml數據轉換成json。
4,規則引擎,你可以使用Spring Xml, Groovy這類DSL來定義route,這樣無需修改代碼,就能達到修改業務邏輯的目的。
例如上邊的規則,from("amqp:queue:order").to("uri:validateBean", "uri:handleBean", "uri:emailBean");使用Spring Xml定義如下:
<route> <from uri="amqp:queue:order"/> <multicast> <to uri="uri:validateBean"/> <to uri="uri:handleBean"/> <to uri="uri:emailBean"/> </multicast> </route>
如果需要在處理完訂單后添加日志,可以改稱如下規則
<route> <from uri="amqp:queue:order"/> <multicast> <to uri="uri:validateBean"/> <to uri="uri:handleBean"/> <to uri="log:com.mycompany.log?level=INFO"/> <to uri="uri:emailBean"/> </multicast> </route>
另外camel提供了大量的內置Processor,用於邏輯運算,過濾等,這樣更加容易定移除靈活的route,例如:
from("amqp:queue:order").filter(header("foo").isEqualTo("bar")).choice() .when(xpath("/person/city = 'London'")) .to("file:target/messages/uk") .otherwise() .to("file:target/messages/others");
這條規則先對訂單進行過濾,只處理header中foo的值為bar的訂單,然后根據用戶的城市進行將訂單傳給不同的endpoint。
Apache Camel的應用場景有很多,這里只是大致列舉了幾種。如果還不是很理解Camel的應用場景,你可以先到
Enterprise Integration Pattern(企業整合模式,簡稱EIP)中去找對應的scenario,點擊每種scenario下的鏈接,就能找到Camel對應的實現。