WCF排隊(duì)調(diào)用由NetMsmqBinding支持
在WCF中,有一種叫做WCF排隊(duì)調(diào)用的操作技術(shù),可以幫助我們在程序開發(fā)中實(shí)現(xiàn)一些特定分功能。那么在這里,我們就會(huì)對此做一個(gè)詳細(xì)的介紹,以方便大家在實(shí)際應(yīng)用中能夠獲得一些幫助。#t#
Windows Communication Foundation 使用 NetMsmqBinding 來支持WCF排隊(duì)調(diào)用。Windows Communication Foundation 在傳輸消息時(shí)不是通過 TCP 或 HTTP,而是通過 Microsoft® 消息隊(duì)列 (MSMQ)。客戶端也不是將 Windows Communication Foundation 消息發(fā)送到某個(gè)在線服務(wù),而是發(fā)送到 MSMQ 隊(duì)列。所有客戶端所面向和交互的對象是隊(duì)列,而非服務(wù)端點(diǎn)。因此,調(diào)用在本質(zhì)上是異步的、是不連接的。直到服務(wù)在將來某一時(shí)刻處理消息時(shí),這些調(diào)用才得以執(zhí)行。
請注意,Windows Communication Foundation 消息并不直接映射到 MSMQ 消息。一個(gè) MSMQ 消息可以包含一個(gè)或多個(gè) Windows Communication Foundation 消息,具體個(gè)數(shù)視合約會(huì)話模式而定。對于必需會(huì)話模式,多個(gè) Windows Communication Foundation 調(diào)用可共存于一個(gè) MSMQ 消息中;而對于允許或不允許會(huì)話模式(由單調(diào)用和單例式服務(wù)使用),每個(gè) Windows Communication Foundation 調(diào)用將位于單獨(dú)的 MSMQ 消息中。
如同各 Windows Communication Foundation 服務(wù)一樣,客戶端會(huì)與代理進(jìn)行交互,如圖 1 所示。由于已將代理配置為使用 MSMQ 綁定,因而該代理不會(huì)向任何特定服務(wù)發(fā)送 Windows Communication Foundation 消息,而是將調(diào)用轉(zhuǎn)換為 MSMQ 消息,然后將這些消息發(fā)布到端點(diǎn)地址所指定的隊(duì)列中。
在服務(wù)端,當(dāng)具有排隊(duì)端點(diǎn)的服務(wù)主機(jī)啟動(dòng)后,主機(jī)會(huì)安裝隊(duì)列偵聽程序。隊(duì)列偵聽程序會(huì)檢測到隊(duì)列中的消息并使其出隊(duì),然后創(chuàng)建主機(jī)端以調(diào)度程序?yàn)榻K點(diǎn)的偵聽器鏈。調(diào)度程序會(huì)照例調(diào)用服務(wù)實(shí)例。如果客戶端向隊(duì)列發(fā)布了多個(gè)消息,偵聽程序會(huì)隨著消息的出隊(duì)創(chuàng)建新的實(shí)例,最終以異步、非連接的并發(fā)調(diào)用結(jié)束。
如果主機(jī)處于離線狀態(tài),消息將在隊(duì)列中保持待處理狀態(tài)。待下次主機(jī)上線時(shí),消息會(huì)被轉(zhuǎn)發(fā)給服務(wù)。
面向隊(duì)列進(jìn)行的、可能處于非連接狀態(tài)的調(diào)用不可能返回任何值,因?yàn)樵趯⑾⒄{(diào)度到隊(duì)列時(shí)并未調(diào)用任何服務(wù)邏輯。此外,調(diào)用可能會(huì)在客戶端應(yīng)用程序停止運(yùn)行后被調(diào)度給服務(wù)進(jìn)行處理,而這時(shí)客戶端根本無法處理返回的值。同樣,調(diào)用也無法將任何服務(wù)端異常返回給客戶端,而且也沒有客戶端用來捕獲和處理異常。由于客戶端不會(huì)因?yàn)檎{(diào)用操作而被封鎖,更確切地說,客戶端只有在將消息送去排隊(duì)的片刻才才被封鎖,因而從客戶端的角度來看,WCF排隊(duì)調(diào)用在本質(zhì)上屬于異步調(diào)用。這些是單向調(diào)用的典型特征。因此,由使用 NetMsmqBinding 的端點(diǎn)所提供的任何合約都只能具有單向操作。Windows Communication Foundation 會(huì)在加載服務(wù)和代理時(shí)對此進(jìn)行驗(yàn)證:
- //只能對排隊(duì)合約執(zhí)行單向調(diào)用
- [ServiceContract]
- interface IMyContract
- {
- [OperationContract(IsOneWay = true)]
- void MyMethod();
- }
由于與 MSMQ 的交互封裝在綁定中,因而在服務(wù)調(diào)用代碼或客戶端調(diào)用代碼中沒有任何與調(diào)用排隊(duì)相關(guān)的內(nèi)容。服務(wù)代碼和客戶端代碼看起來與任何其他 Windows Communication Foundation 客戶端代碼和服務(wù)代碼都是一樣的,如圖 2 所示。
針對排隊(duì)服務(wù)定義端點(diǎn)時(shí),端點(diǎn)地址中必須包含隊(duì)列名稱和隊(duì)列類型(公有或私有):
- < endpoint
- address = "net.msmq://localhost/private/
- MyServiceQueue"
- binding = "netMsmqBinding"
- ...
- />
***,MSMQ 是 Windows Communication Foundation 的事務(wù)性資源管理器。如果隊(duì)列是事務(wù)性的,則當(dāng)客戶端的事務(wù)中止時(shí),客戶端所發(fā)布的消息將會(huì)回滾。在服務(wù)端,從隊(duì)列中讀取消息時(shí)會(huì)啟動(dòng)新的事務(wù)。如果服務(wù)參與并中止該事務(wù)(可能因異常而導(dǎo)致),消息會(huì)回滾到隊(duì)列中等待下一次重試。Windows Communication Foundation 提供了完善的故障檢測和病毒消息處理支持功能。
以上就是我們?yōu)榇蠹医榻B的WCF排隊(duì)調(diào)用的相關(guān)內(nèi)容。