前面,我已經集中用了三篇文章來講Shuttle ESB的入門實例與宏觀概念。Shuttle ESB一共有兩種發送消息的模式:請求/相應模式與Pub/Sub模式。
關于這兩種模式的區分,請看下面文章的介紹:Shuttle ESB(三)――架構模型介紹(2)
在Shuttle ESB的第一篇文章中,關于入門實例的介紹,是基于Command命令的請求響應模式。這種模式發送的消息比較簡單,是同步的。發送消息端與接收消息端的行為耦合性比較大。請求發送后,其他進程都會處于等待狀態,等待服務端返回響應信息后,客戶端才會進行其他行為。
PS:Shuttle ESB的Command模式與Pub/Sub模式完全類似于Ejb中的P2P與Pub/Sub。
然而,Pub/Sub模式將消息的發布端與訂閱端進行了充分的解耦。Pub端發送消息后,不用等待消息的返回,它可以選擇繼續發送或者停止發送。接收端如果想接收消息,只需訂閱該事件消息即可。
我們在項目中真正使用Shuttle ESB的時候,大多數情況下,我們會使用Pub/Sub模式。下面,我們就對這種模式進行講解。
注意:即便是基于命令的請求/相應模式,也可用發布訂閱的方式實現。
目前,Shuttle ESB只支持三種隊列:微軟的消息隊列MSMQ、SqlServer基于表的隊列和Rabbit MSMQ。Shuttle ESb的Pub/Sub模式,需要MSMQ和SqlServer基于表隊列兩種消息隊列進行實現。
關于基于SqlServer表隊列,我們大家可能會有疑義:使用SqlServer數據庫,不就限定了Shuttle ESB的適用范圍了嗎?
大家不必有此擔心。Shuttle ESB核心組件是不基于任何第三方組件的。將來它肯定會支持MySql和Oracle或者別的數據庫的。目前只是因為Eben沒有使用過Oracle,對Oracle還不是很熟悉,所以沒有做基于Oracle的隊列實現。當然他跟我提過多次,希望我為開源社區做點貢獻,在GitHub上給他貢獻點兒代碼。可是這個實現也不是一天兩天的事兒,我現在實在沒時間研究。這段兒時間又比較緊迫,我得考慮生計問題啊!得先活下來,在考慮做貢獻的事兒吧!過了年再說吧。
言歸正傳,我們繼續來介紹基于Pub/Sub模式的Demo實現。功能很簡單:
從消息發布端Pub發布一個消息事件OrderCompletedEvent,多個客戶端(如SubA和SubB)訂閱該事件OrderCompletedEvent。那么當Pub發布消息后,SubA和SubB就能夠收到該消息OrderCompletedEvent。
SubA和SubB接收到消息后,根據需要進行一定的處理。然后他們都會發布一個WorkDoneEvent事件消息。這次服務端訂閱WorkDoneEvent消息。當SubA和SubB發布WorkDoneEvent消息后,Pub端就能夠接收到該消息WorkDoneEvent。
PS:消息的發布端與訂閱端為什么使用兩個不同的消息呢?因為如果使用同一個消息的話,上面的實現,將會形成死循環。原因就是啟動的Shuttle ESB實例后,該實例會監聽一個或多個給定的消息隊列,如果發布端和訂閱端監聽聽一個隊列,就形成死循環了。
下面介紹一些開發實例的準備工作
1、安裝微軟消的息隊列:MSMQ
具體安裝請參見:Shuttle ESB(一):入門實例
2、創建數據庫并初始化數據庫表隊列
在SqlServer中創建數據庫:shuttle(可自定義數據庫名稱)。然后運行“{root}Shuttle.ESBsourceShuttle.ESB.SqlServerScriptsSubscriptionManagerCreate.sql”腳本(在源碼中,本例子中提供該腳本),創建以及初始化SqlServer表隊列。
3、安裝NuGet插件
它就是一款管理第三方dll的插件。關于NuGet的安裝、使用,網上有一大堆,這里我就不詳細介紹了。大家自己百度即可。
詳細實例,下篇文章繼續介紹。