簡介
Microsoft 近期推出了一種用於生成集成應用程序的新平台——Microsoft .NET 框架。.NET 框架允許開發人員使用任何編程語言迅速生成和部署 Web 服務和應用程序。Microsoft Intermediate Language (MSIL) 和實時 (JIT) 編譯器使這種不依賴語言的框架得以實現。
與 .NET 框架同時面世的還有一種新的編程語言 C#(讀作“C sharp”)。C# 是一種簡單、新穎、面向對象和類型安全的編程語言。利用 .NET 框架和 C#(除 Microsoft? Visual Basic? 和 Managed C++ 之外),用戶可以編寫功能強大的 Microsoft Windows? 和 Web 應用程序及服務。本文提供了這樣的一個解決方案,它的重點是 .NET 框架和 C# 而不是編程語言。C# 語言的介紹可以在“ C# 簡介和概述(英文)”找到。
近期的文章“MSMQ:可伸縮、高可用性的負載平衡解決方案(英文)”介紹了一種解決方案,用於高可用性消息隊列 (MSMQ) 的可伸縮負載平衡解決方案體系結構。此解決方案中涉及了一種將 Windows 服務用作智能消息路由器的開發方案。這樣的解決方案以前只有 Microsoft Visual C++? 程序員才能實現,而 .NET 框架的出現改變了這種情況。從下面的解決方案中,您可以看到這一點。
.NET 框架應用程序
這裡介紹的解決方案是一種用來處理若干消息隊列的 Windows 服務;其中每個隊列都是由多個線程進行處理(接收和處理消息)。處理程序使用循環法技術或應用程序特定值(消息 AppSpecific 屬性)從目的隊列列表中路由消息,並使用消息屬性來調用組件方法。(示例進程也屬於這種情況。)在後一種情況下,組件的要求是它能夠實現給定的接口 IWebMessage。要處理錯誤,應用程序需要將不能處理的消息發送到錯誤隊列中。
消息應用程序的結構與以前的活動模板庫 (ATL) 應用程序相似,它們之間的主要不同在於用於管理服務的代碼的封裝和 .NET 框架組件的使用。要創建 Windows 服務,.NET 框架用戶僅僅需要創建一個從 ServiceBase(來自 System.ServiceControl 程序集)繼承的類。這毫不奇怪,因為 .NET 框架是面向對象的。
應用程序結構
應用程序中主要的類是 ServiceControl,它是從 ServiceBase 繼承的。因而,它必須實現 OnStart 和 OnStop 方法,以及可選的 OnPause 和 OnContinue 方法。事實上,類是在靜態方法 Main 內構造的:
using System; using System.ServiceProcess; public class ServiceControl: ServiceBase { // 創建服務對象的主入口點 public static void Main() { ServiceBase.Run(new ServiceControl()); } // 定義服務參數的構造對象 public ServiceControl() { CanPauseAndContinue = true; ServiceName = "MSDNMessageService"; AutoLog = false; } protected override void OnStart(string[] args) {...} protected override void OnStop() {...} protected override void OnPause() {...} protected override void OnContinue() {...} }
ServiceControl 類創建一系列 CWorker 對象,即,為需要處理的每個消息隊列創建 CWorker 類的一個實例。根據定義中處理隊列所需的線程數目,CWorker 類依次創建了一系列的 CWorkerThread 對象。CWorkerThread 類創建的一個處理線程將執行實際的服務工作。
使用 CWorker 和 CWorkerThread 類的主要目的是確認服務控件 Start、Stop、Pause 和 Continue 命令。因為這些進程必須是無阻塞的,命令操作最終將在後台處理線程上執行。
CWorkerThread 是一個抽象類,被 CWorkerThreadAppSpecific 、CWorkerThreadRoundRobin 和 CWorkerThreadAssembly 繼承。這些類以不同的方式處理消息。前兩個類通過給另一隊列發送消息來處理消息(其不同之處在於確定接收隊列路徑的方式),最後一個類則使用消息屬性來調用組件方法。
.NET 框架內部的錯誤處理是以基類 Exception 為基礎的。當系統引發或捕獲錯誤時,這些錯誤必須是從 Exception 中導出的類。CWorkerThreadException 類就是這樣一種實現,它通過附加額外屬性(用於定義服務是否應繼續運行)來擴展基類。
最後,應用程序包含兩種結構。這些值類型定義了輔助進程或線程的運行時參數,以簡化 CWorker 和 CWorkerThread 對象的結構。使用值類型結構(而不是引用類型類)能夠確保這些運行時參數維護的是數值(而不是引用)。