讀《Spring Integration》part2.3

這一部分我將簡單介紹書中關(guān)于Message和Channel的內(nèi)容华嘹,Channel的部分將會具體介紹一些常用的Channel

Message

上一篇說過豫领,Message作為整個流程傳輸?shù)男畔⒃拚恚瑢?shí)現(xiàn)了各個部分之間的解耦。它可以是任何形式弥奸,String/Object/XML..但是它包含了要傳輸?shù)乃袃?nèi)容蛤克。

Message由兩部分組成:[Message Header + PayLoad]

Message Header就像是信件的信封,雖然收件人不關(guān)心信封上的郵票闷祥,地址等內(nèi)容娱颊,但是這些內(nèi)容確保了信件能夠流到收件人手里。具體的來講就是流程中要用與決策或者執(zhí)行的時候要進(jìn)行參考的信息凯砍。PayLoad則是具體新建的內(nèi)容箱硕。

根據(jù)角色和實(shí)現(xiàn),Message可以分為三部分:

Document messages that contain only information

Command messages that instruct the recipient to perform various operations

Event messages that indicate notable occurrences in the system and to which the recipient may react

創(chuàng)建一個Message的流程:

Step 1: A Builder is created with Payload

Step 2: Headers are added

Step 3: A Message is created by the Builder

Message helloMessage = MessageBuilder.withPayload("Hello, world!").setHeader("custom.header", "Value").setHeaderIfAbsent("custom.header2", "Value2").build();

Channel

Channel在整個流程中起到了管道的作用悟衩,他不用在意消息的內(nèi)容剧罩,也幾乎不對消息進(jìn)行處理,他只需要知道消息從哪里來座泳,要往哪里去就可以了惠昔。但是他的作用并不止于一個二傳手幕与,他還可以實(shí)現(xiàn)很多分發(fā)的策略。

Channel都繼承自Message Channel類镇防,Message Channel又衍生了兩個子類:SubscribableChannel 和 PollableChannel啦鸣,他們的區(qū)別在于是否緩存,書中有兩句話說明了他們的職責(zé):SubscribableChannel就像它的名字一樣是訂閱式的来氧,無需緩存诫给,解釋為“I’ll let you know when I’ve got something”,所以他的方法返回boolean值饲漾。PollableChannel需要緩存并做輪詢操作蝙搔,解釋為“Do you have any messages for me”。

接下來用一個簡單的例子來介紹幾種Channel

Case:channelA -> service-activatorA -> channelB -> service-activatorB -> channelC -> adapterA

<channel id="channelA"/>

<service-activator input-channel="channelA" output-channel="channelB" ref="service-activatorA"/>

<channel id="channelB"/>

<service-activator input-channel="channelB" output-channel="channelC" ref="service-activatorB"/>

<channel id="channelC"/>

<outbound-channel-adapter channel="channelC" ref="adapterA"/>

有一個問題:這個流程是同步的考传,也就是說只有adapter做完才會有下一個message進(jìn)來吃型。那么如果adapter的效率不高,因?yàn)榫W(wǎng)絡(luò)或者什么原因僚楞,就會限制整個的處理速度勤晚。這個時候就應(yīng)該將service-activatorB和adapterA拆開,通過異步實(shí)現(xiàn)泉褐,就引入了帶Queue的channel赐写。配置如下:

<channel id="channelC"><queue /></channel>

下一個問題:如果有多個adapter都要發(fā)送這個flow的message,就是遇到類似分流的事情膜赃,該如何操作挺邀?這里要使用publish-subscribe-channel,所有配置以該channel為inbound的component都能接收到,但是他有一個缺點(diǎn)跳座,就是不能直接實(shí)現(xiàn)異步端铛,如果想實(shí)現(xiàn)異步還要通過bridge結(jié)構(gòu)來輔助實(shí)現(xiàn)。配置如下:

<publish-subscibe-channel id="channelC"/>

<bridge nput-channel="channelC" output-channel="channelD"/>

<channel id="channelD"><queue /></channel>

在下一個問題:如果信息處理的順序有規(guī)定疲眷,也就是說要按一定的優(yōu)先級來結(jié)束最后的flow禾蚕,要怎么做呢?可以使用priority-queue來控制進(jìn)來message的先后順序狂丝。配置如下:

<channel id="channelA"><priority-queue comparator="comparatorA"/></channel>

Channel collaborators

MessageDispatcher消息分發(fā)器换淆,有兩個子類,一個是UnicastingDispatcher,點(diǎn)對點(diǎn)進(jìn)行發(fā)布几颜,另一種是BroadcastingDispatcher進(jìn)行廣播式的分發(fā)倍试。MessageDispatcher中依賴了一個Handler,用來實(shí)現(xiàn)邏輯部分菠剩。而dispatch則實(shí)現(xiàn)Delivery易猫。

ChannelInterceptor是另一個和Channel相關(guān)的Component。它可以在Channel收到或者發(fā)送message之前或者之后進(jìn)行一些處理(攔截)具壮。它包括的方法有{preSend准颓,postSend,afterSendCompletion,preReceive,postReceive,afterReceiveCompletion}具體是做什么的也很明顯哈蝇。

在channel中注冊:channel.addInterceptor(someChannelInterceptor);

可以通過如下方式配置interceptor:

<channel id="channelC">

<interceptors><beans:ref bean="interceptorA"/></interceptors>

</channel>

還可以通過在interceptor中配置wire-tap來將message送到另一個Channel,用于分析message攘已,而不在住流程中分析炮赦。

<interceptors><wire-tap channel="monitoringChannel"/></interceptors>

interceptor使用MessageSelector決定是否channel能夠被發(fā)送。


Summary

這一部分主要是簡單介紹了Message是什么样勃,有哪些種類吠勘。主要介紹了一些Channel的一些應(yīng)用場景。其實(shí)這一部分內(nèi)容峡眶,其實(shí)看到配置是如何寫的更容易理解這個channel的使用剧防。最后一部分其實(shí)還有一些問題,可能之后在具體應(yīng)用里面具體分析辫樱。下一部分將會簡單介紹一些EndPoint峭拘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狮暑,隨后出現(xiàn)的幾起案子鸡挠,更是在濱河造成了極大的恐慌,老刑警劉巖搬男,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拣展,死亡現(xiàn)場離奇詭異,居然都是意外死亡缔逛,警方通過查閱死者的電腦和手機(jī)备埃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐奴,“玉大人瓜喇,你說我怎么就攤上這事∏该樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵望众,是天一觀的道長匪补。 經(jīng)常有香客問我,道長烂翰,這世上最難降的妖魔是什么夯缺? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮甘耿,結(jié)果婚禮上踊兜,老公的妹妹穿的比我還像新娘。我一直安慰自己佳恬,他們只是感情好捏境,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布于游。 她就那樣靜靜地躺著,像睡著了一般垫言。 火紅的嫁衣襯著肌膚如雪贰剥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天筷频,我揣著相機(jī)與錄音蚌成,去河邊找鬼。 笑死凛捏,一個胖子當(dāng)著我的面吹牛担忧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坯癣,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓶盛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坡锡?” 一聲冷哼從身側(cè)響起蓬网,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹉勒,沒想到半個月后帆锋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禽额,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年锯厢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脯倒。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡实辑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藻丢,到底是詐尸還是另有隱情剪撬,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布悠反,位于F島的核電站残黑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斋否。R本人自食惡果不足惜梨水,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茵臭。 院中可真熱鬧疫诽,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逼龟,卻和暖如春评凝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腺律。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工奕短, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匀钧。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓翎碑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親之斯。 傳聞我的和親對象是個殘疾皇子日杈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)佑刷,斷路器莉擒,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 為什么使用Spring Integration Spring Integration使整個項(xiàng)目,以及項(xiàng)目的每一個模...
    吉祥如意酥閱讀 547評論 2 5
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • 轉(zhuǎn)載自http://blog.csdn.net/qq295445028/article/details/79930...
    WebSSO閱讀 2,931評論 0 3
  • 佛法講“有求皆苦”瘫絮,把目標(biāo)放在外在涨冀,必定有苦,因?yàn)橥庠诘囊蚓壥亲约簾o法主宰的麦萤,外在的一切也都是會改變的鹿鳖。 求不得,...
    落雨清楓閱讀 523評論 0 1