从代码内部:骆驼路由引擎第一部分
因此,最近我重新燃起了對Apache Camel工作原理的興趣。 Camel是一種功能強大的集成工具,用途非常廣泛,但是只要我投入使用,我都會忍不住想:“嗯,這到底是怎么做到的!” …猜想我只是有一個訣竅,不只是接受它的美妙。我想知道為什么。
如果您過去一直關注我的一些文章,您會記得我確實有一篇博客文章,深入探討了Camel DSL API的工作原理 。 更具體地說,您如何神奇地鍵入“ from(..)”,“ choice(..)”,“ simple(..)”等,并且DSL足夠聰明,足以知道您的意思以及如何將所有內容串在一起。 如果您對所有操作方式都感興趣,請在該帖子上花點時間。 請注意,其中有一些冗長而冗長的UML類圖。
因此,如果您回想起前一篇文章,則DSL(無論是Java DSL,XML還是Scala或任何其他)都具有非常特殊的作用。 它可以幫助集成路線的作者非常清楚地表達自己的意圖,然后將其構建為一個名為RouteDefinition的抽象。 RouteDefinition是您路線的“藍圖”,并且了解您所有的處理器 , EIP和組件 。 您可以考慮從(..)調用的任何時間是新RouteDefinition的開始。 其余路線賦予其形狀。 因此,對于每個from(..),都有一個到RouteDefinition的一對一映射。
因此,當CamelContext啟動時,它將收集所有RouteDefinition并開始從它們中構建一條路由。 看一下DefaultCamelContext#doStartCamel作為所有這些的入口點。 除其他重要事項外,例如將注冊表,端點,啟動基本服務,管理等放在一起,您將看到對DefaultCamelContext#startRouteDefinitions的調用。 這告訴RouteDefinitions構建Route對象,即路由交換的實際使用者(輸入)+處理器(輸出)的管道 。
下一個方框將詳細介紹這一切的工作原理。 就像以前有關Camel內部工作的博客文章一樣,這個細節主要是給我的:即,將來當我忘記了一半的時候,我想復習一下。 一些想為駱駝做貢獻的人可能會發現這很有趣。 對于其他所有人。.隨時跳過此塊。
–開始詳細部分–
DefaultCamelContext將遍歷每個RouteDefinition ,并將嘗試構建Route S和RouteContext S的列表。
快速繞道:
什么是RouteContext ? 簡單來說,您可以將其視為Route的大腦,以及路由特定配置所處的地方(流緩存,跟蹤,處理故障等)。 它了解“來自”消費者,管道的其余部分,攔截策略,路由策略,并能夠構造將在交換機上運行的Route。
這可能會造成混淆,因為在實際上它們正在構建RouteContext和構建Route時,有許多名為“ addRoutes()”的方法的調用。 但是,將其放在一邊。 因此,對RouteDefinition#addRoutes(..)的調用將返回RouteContext對象的列表。 它還將填充(最初為空)路由的列表。 這里的重數基本上是n到n。 因為您可以有多個RouteDefinition 輸入 (例如,通過將多個from(..)。from(..)串在一起),所以可以預期到路由的單個1-to-1 RouteContext,以及一對PER from( )。 因此,在前面的示例中,列表中將有兩個RouteContext和兩個Route。 在對addRoutes(..)的調用中,它還會嘗試將輸出定義轉換為真實的Processors。 處理器是Route對象的基礎。 每個處理器都是基于其各自的定義(例如ChoiceDefinition,LogDefinition)構建的,但最終被包裝在Channel對象中并添加到RouteContext中。
因此,總結一下, RouteDefinition將創建Route,RouteContext,并將各個輸出定義轉換為Processors。 創建這些路由后,將根據新創建的Route + RouteContext對創建一個RouteService ,并使用CamelContext建立該路由服務,以便稍后啟動和控制路由的生命周期。
–結束詳細部分–
因此,…一旦初始化了RouteService ,就需要啟動路由,這取決于它們是否自動啟動以及它們的順序。 再次看一下DefaultCamelContext#doStartCamel ,對底部的是對DefaultCamelContext#doStartOrResumeRoutes的調用。 這將遍歷我們的RouteService S并為路線確定正確的啟動順序,然后啟動它們。
路線分為兩個階段:
- 熱身:在熱身階段,我們瀏覽所有路徑并啟動所有“輸出”或處理器/設備。 駱駝要注意確保
首先發生這種情況是因為我們不希望在所有“輸出”可用之前就讓“輸入”或使用者啟動。 - 啟動/恢復:啟動使用者! 這是特定于端點/組件的。 例如,JMS使用者將開始偵聽目的地。
注意,在生命周期的這些階段的所有階段,都有可以調用的回調,以便您可以插入此生命周期并添加自己的自定義啟動代碼以與應用程序協調。 看看Camel API中可用的回調類型LifecylceStrategy
那里有它。 這是將路由定義轉換為實際路由然后啟動的方式。
在第二部分中,我希望探討如何將處理器鏈接在一起,包括使用AsyncProcessor進行更高級的鏈接。
翻譯自: https://www.javacodegeeks.com/2013/08/from-inside-the-code-camel-routing-engine-part-i.html
總結
以上是生活随笔為你收集整理的从代码内部:骆驼路由引擎第一部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的中介器设计模式-示例教程
- 下一篇: 世嘉游戏《符文工厂 3 豪华版》Stea