Camel中的几个重要概念之Routes, RouteBuilders 和 Java DSL
http://jnn.iteye.com/blog/320097
Route
 
 一個route就是將一個輸入隊列中獲得的消息,通過一步一步地設置好的邏輯判斷(例如過濾器和路由規則)到達一個目標隊列中(如果有的話)。Camel為應用開發者提供了兩種途徑來定義這些路由規則。一個是通過XML來定義路由信息,有關這部分的內容不會在本文檔中討論。另一種方式就是通過Camel所謂的Java DSL(domain-specific language) 來定義。
 
 Introduction to Java DSL
 
 對于許多人來說,要實現一個“domain-specific language” (面向領域的語言)涉及到了一個能夠處理這個特定領域語言的關鍵字以及語法的編譯器或者是解釋器。對于Camel來說,它沒有這么做。在Camel文檔中一直都在使用的“Java DSL”而不是 “DSL” ,其目的就是想避免混淆這兩個概念。Camel中的“Java DSL”是一個可以像DSL一樣被使用的類庫,除此之外它還使用了大量Java的語義。你可以看一下下面的例子,在例子下面的備注里, 解釋了這個例子的中所用的組件。
 
 Example of Camel's "Java DSL"
 RouteBuilder builder = new RouteBuilder() {
 ??? public void configure() {
 ??????? from("queue:a").filter(header("foo").isEqualTo("bar")).to("queue:b");
 ??????? from("queue:c").choice()
 ??????????????? .when(header("foo").isEqualTo("bar")).to("queue:d")
 ??????????????? .when(header("foo").isEqualTo("cheese")).to("queue:e")
 ??????????????? .otherwise().to("queue:f");
 ??? }
 };
 CamelContext myCamelContext = new DefaultCamelContext();
 myCamelContext.addRoutes(builder);
 
 上面例子的第一行創建一個一個RouteBuilder的匿名類的實例,這個匿名類需要實現 configure()方法。
 camelContext.addRoutes(RouterBuilder builder) 方法中調用了builder.setContext(this)方法,這樣RouteBuilder對象就獲得了與之對應的CamelContext的,然后調用builder.configure()方法。在configure方法中,可以調用例如 from(), filter(), choice(), when(),isEqualTo(), otherwise()以及to() 方法。
 RouteBuilder.from(String uri) 方法會調用與之對應的CamelContext的getEndpoint(uri)方法來獲得指定的Endpoint,并用一個FromBuilder包裝這個Endpoint。這樣 FromBuilder.filter(Predicate predicate) 方法就會創建一個在header("foo").isEqualTo("bar")這個表達式基礎創建的Predicate(所謂的條件)創建一個FilterProcessor對象。就這樣, 通過定義這些操作我們逐漸構建出了一個Route對象(使用RouterBuilder進行包裝的)并且將這個Route對象添加進了與RouteBuilder所關聯的CamelContext中。
 
 Critique of Java DSL
 
 在camel的在線文檔中比較了Java DSL與建立在XML基礎上的Spring配置文件的在配置routes和endpoint方法優勢。特別是Java DSL比 XML 來說要精簡很多。還有需要指出的是,現在很多集成開發環境都提供了一個自動補全的功能, 當然這種功能可以編寫Java DSL的過程中使用,這也可以大大降低開發者編寫Java DSL的難度。
 
 當然在Camel的文檔中還忽略了一些內容,就是通過一個解析器來處理存放在外部的DSL。當前Camel并沒有提供這也的解析器,并且我也不知道Camel的開發維護人員是否打算做這樣一個解析器。我像這個DSL解析器應該提供一個比當前Java DSL更大的一個好處。這個DSL可以通過巴柯斯范式來定義語法,這樣Camel的用戶可以通過閱讀巴柯斯范式來獲取書寫DSL的知識,而不是像現在需要花費大量的時間通過閱讀RouterBuilder類的API來獲取。
總結
以上是生活随笔為你收集整理的Camel中的几个重要概念之Routes, RouteBuilders 和 Java DSL的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Camel中的几个重要概念之 Compo
- 下一篇: Camel 组件之 Timer
