天天看點

從代碼内部:駱駝路由引擎第一部分

是以,最近我重新燃起了對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進行更進階的連結。

參考:

在Christian Posta – Software Blog部落格上,使用我們的JCG合作夥伴 Christian Posta 使用k最近鄰+遺傳算法建立價格模型 。

翻譯自: https://www.javacodegeeks.com/2013/08/from-inside-the-code-camel-routing-engine-part-i.html