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